2012-05-01 19 views
5

Sử dụng XPath, tôi muốn "So khớp toàn bộ từ" (tùy chọn cho người dùng, giống như trong tìm kiếm VS).XPath: Đối sánh toàn bộ từ (sử dụng chức năng phù hợp với cờ không phân biệt chữ hoa chữ thường)

Dường như các chức năng containsmatches hoạt động tương tự mặc dù các kết quả phù hợp cho phép cờ như i cho trường hợp không nhạy cảm.

Nói cách khác, tôi nhận được kết quả tương tự với các truy vấn hai XPath:

<pets> 
    <dog name="Rupert" color="grey"/> 
    <dog name="Ralph" color="brown"/> 
    <cat name="Marvin the Cat" color="white"/> 
    <cat name="Garfield the Cat" color="orange"/> 
    <cat name="Cat" color="grey"/> 
    <cat name="Fluffy" color="black"/> 
</pets> 

Matches XPath: //cat[descendant-or-self::*[@*[matches(.,'Cat')]]] 
    returns: 
    <cat name="Marvin the Cat" color="white"/> 
    <cat name="Garfield the Cat" color="orange"/> 
    <cat name="Cat" color="grey"/> 


Contains XPath: //cat[descendant-or-self::*[@*[contains(.,'Cat')]]] 
    returns: 
    <cat name="Marvin the Cat" color="white"/> 
    <cat name="Garfield the Cat" color="orange"/> 
    <cat name="Cat" color="grey"/> 

Nhưng tôi muốn sử dụng matches để trả về kết quả phù hợp với "Cát" toàn bộ chỉ từ:

<cat name="Cat" color="grey"/> 

Tôi làm cách nào để điều chỉnh truy vấn đối sánh để nó khớp với toàn bộ từ?

EDIT: Tôi quên đề cập đến rằng tôi vẫn cần sử dụng hàm so khớp vì tôi cần cờ không phân biệt chữ hoa chữ thường.

Trả lời

5

Điều gì về việc sử dụng ^$ ký tự làm neo?

//cat[descendant-or-self::*[@*[matches(.,'^Cat$')]]] 

Từ RegEx Syntax in XQuery 1.0 and XPath 2.0:

Hai meta-nhân vật, ^$ được thêm vào. Theo mặc định, ký tự meta ^ khớp với phần đầu của toàn bộ chuỗi, trong khi $ khớp với kết thúc của toàn bộ chuỗi.

+0

Hmm .. điều này mang lại cho tôi kết quả tôi muốn. Nhưng bạn có thể giải thích^$ neo? Tôi chưa bao giờ sử dụng chúng trước đây .. – developer

+0

Đã thêm liên kết vào câu trả lời, xem phần "Hai ký tự meta ...". –

+1

Cảm ơn, tôi vẫn sẽ cần phải làm một số thử nghiệm, nhưng điều này dường như làm các trick! – developer

2

Điều này có phù hợp với bạn không?

//cat[@*='Cat'] 
+0

Không hoàn toàn là những gì tôi đang tìm kiếm. Tôi vẫn muốn sử dụng các chức năng phù hợp vì tôi cần trường hợp vô cảm ... (xem chỉnh sửa ở trên). – developer

1

này:

//cat[@*='Cat'] 

kết quả trong:

<cat name="Cat" color="grey"/> 

tôi xác nhận sử dụng Xacobeo.

+0

Không hoàn toàn là những gì tôi đang tìm kiếm. Tôi vẫn muốn sử dụng các chức năng phù hợp vì tôi cần trường hợp vô cảm ... (xem chỉnh sửa ở trên). – developer

+1

@developer Hãy thử điều này: '// mèo [dịch (@ *, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') = 'mèo'] ' này giả định bạn luôn vượt qua chuỗi bạn muốn kết hợp bởi như thường. –

2

Có ba hàm/toán tử liên quan ở đây.

đối sánh() thực hiện một cụm từ thông dụng khớp; bạn có thể sử dụng nó để phù hợp với một chuỗi con hoặc để phù hợp với toàn bộ chuỗi bằng cách sử dụng neo (^ cat $) và bạn có thể đặt cờ 'i' để làm cho trường hợp bị mù.

chứa() thực hiện đối sánh chính xác của chuỗi con; bạn có thể sử dụng đối số thứ ba (đối chiếu) để yêu cầu một trường hợp mù phù hợp, nhưng cách thức mà collations được chỉ định phụ thuộc vào bộ xử lý bạn đang sử dụng.

Toán tử eq thực hiện đối sánh chính xác của toàn bộ chuỗi; "collation mặc định" (mà trong trường hợp XPath thường sẽ được thiết lập bằng cách sử dụng API của bộ xử lý) có thể được sử dụng để yêu cầu kết hợp mù trường hợp.Điều này có vẻ là một trong đó là gần nhất với yêu cầu của bạn, nhược điểm duy nhất là chỉ định collation là phụ thuộc vào hệ thống nhiều hơn bằng cách sử dụng cờ "i" với các trận đấu().

2

Nhưng tôi muốn sử dụng trận đấu để đưa ra kết quả phù hợp với "Cát" cả chỉ từ:

<cat name="Cat" color="grey"/> 

Có biểu thức XPath khác nhau mà chọn phần tử truy nã:

Sử dụng:

/*/cat[matches(@name, '^cat$', 'i')] 

Hoặc sử dụng:

/*/cat[lower-case(@name) eq 'cat'] 

XSLT - dựa xác minh:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/cat[matches(@name, '^cat$', 'i')]"/> 
====== 
    <xsl:copy-of select= 
    "/*/cat[lower-case(@name) eq 'cat']"/> 

</xsl:template> 
</xsl:stylesheet> 

khi áp dụng trên tài liệu XML cung cấp:

<pets> 
    <dog name="Rupert" color="grey"/> 
    <dog name="Ralph" color="brown"/> 
    <cat name="Marvin the Cat" color="white"/> 
    <cat name="Garfield the Cat" color="orange"/> 
    <cat name="Cat" color="grey"/> 
    <cat name="Fluffy" color="black"/> 
</pets> 

chuyển đổi này đánh giá hai XPath biểu thức và sao chép các yếu tố được chọn cho đầu ra:

<cat name="Cat" color="grey"/> 
====== 
    <cat name="Cat" color="grey"/>