2010-10-15 30 views
9

Nếu tôi có một file nguồn như thế này:Bạn làm cách nào để khớp các ký tự đại diện với XSLT?

<animal name="fred_monkey" /> 
<animal name="jim_banana" /> 
<animal name="joe_monkey" /> 

Tôi có thể làm một biểu thức XPath trong stylesheet của tôi là chọn lựa duy nhất con vật với chuỗi '_monkey' trong tên của họ?

ví dụ: khớp với ký tự đại diện '* _monkey'?

+0

Phiên bản nào của XSLT để bạn sử dụng? –

+0

Câu hỏi hay, +1. Xem câu trả lời của tôi cho các giải pháp XSLT 1.0 và XSLT 2.0.:) –

+0

@iYasha Tôi hiện đang sử dụng 1.0, nhưng quan tâm đến việc tìm hiểu sự khác biệt giữa hai. –

Trả lời

26

Tôi có thể làm một biểu thức XPath trong stylesheet của tôi là chọn lựa duy nhất động vật với chuỗi '_monkey' trong tên của họ?

ví dụ: khớp với ký tự đại diện '* _monkey'?

wildcard Điều này có nghĩa một chuỗi kết thúc với "_monkey", không một chuỗi chứa "_monkey".

Sử dụng:

//animal[ends-with(@name, '_monkey')] 

Trên đây sử dụng các tiêu chuẩn XPath 2.0 chức năng ends-with() và vì thế chỉ có trong XSLT 2.0.

Trong XSLT 1.0 sử dụng XPath 1.0 biểu thức sau đây:

//animal[substring(@name, string-length(@name) -6)='_monkey'] 

Nó không được khuyến khích sử dụng các // viết tắt như thế này có thể dẫn đến việc đánh giá hiệu quả. Sử dụng chuỗi kiểm tra vị trí cụ thể hơn bất cứ khi nào cấu trúc của tài liệu XML được biết đến. Ví dụ, nếu animal yếu tố này là tất cả trẻ em trong những yếu tố trên cùng của tài liệu XML, sau đó XPath sau (2.0 hoặc 1.0, tương ứng) biểu thức có thể hiệu quả hơn:

/*/animal[ends-with(@name, '_monkey')] 

/*/animal[substring(@name, string-length(@name) -6)='_monkey'] 

Tùy thuộc vào nhu cầu cụ thể của một người (ví dụ như bạn thực sự có nghĩa là "chứa" chứ không phải "kết thúc với"), các chức năng contains(), starts-with()substring() cũng có thể hữu ích:

contains(someString, someTargetString) 

starts-with(someString, someTargetString) 

substring(someString, start-index, length) = someTargetString 

Cuối cùng, thuộc tính match của <xsl:templates> không cần chứa biểu thức XPath tuyệt đối - chỉ biểu thức XPath tương đối xác định đủ ngữ cảnh được khuyến nghị sử dụng.

Như vậy, sử dụng ở trên là biểu thức phù hợp sẽ là một cái gì đó như:

<xsl:template match="animal[ends-with(@name, '_monkey')]"> 

<xsl:template match= 
    "animal[substring(@name, string-length(@name) -6)='_monkey']"> 
+0

Câu trả lời hay. Cảm ơn! –

+3

+1 Để có giải thích mở rộng. –

+0

Làm cách nào để sử dụng điều này: '' trong XSLT 1.0? – Si8

Các vấn đề liên quan