2009-04-05 29 views
13
đoạn

XML:Chọn nút con dựa trên nội dung của họ

<AA> 
    <BB>foo</BB> 
    <CC>bar</CC> 
    <DD>baz</DD> 
    <EE>bar</EE> 
</AA> 

Làm thế nào để chọn tất cả các nút con của <AA>bar như nội dung của nó? Trong ví dụ trên, tôi muốn chọn <CC><EE>. Tôi đang nghĩ đến giải pháp là cái gì đó như:

<xsl:template match="AA"> 
    <xsl:for-each select="???" /> 
</xsl:template> 

Trả lời

27

Một trong những giải pháp đơn giản nhất cho câu hỏi của OP là biểu thức XPath sau:

*/*[.='bar'] 

Do lưu ý, rằng không có hướng dẫn XSLT là liên quan - đây chỉ là biểu thức XPath, vì vậy câu hỏi chỉ có thể được gắn thẻ XPath.

Từ đây, người ta có thể sử dụng biểu thức XPath này trong XSLT theo nhiều cách khác nhau, chẳng hạn như áp dụng mẫu trên tất cả các nút được chọn.

Ví dụ, dưới đây là một chuyển đổi XSLT mà mất tài liệu XML và sản xuất với nhau, trong đó tất cả các yếu tố - con của <AA> có nội dung không phải là bằng "bar" được xóa:

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

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="AA"> 
     <xsl:copy> 
     <xsl:apply-templates select="*[. = 'bar']"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Khi điều này chuyển đổi được áp dụng trên các tài liệu XML gốc:

<AA> 
    <BB>foo</BB> 
    <CC>bar</CC> 
    <DD>baz</DD> 
    <EE>bar</EE> 
</AA> 

kết quả mong muốn được sản xuất :

<AA> 
    <CC>bar</CC> 
    <EE>bar</EE> 
</AA> 

Do lưu ý:

Trong một mô hình phù hợp, chúng tôi thường không cần phải xác định một biểu thức XPath tuyệt đối, nhưng chỉ cần một cái tương đối, vì vậy biểu thức XPath đầy đủ là một cách tự nhiên đơn giản hóa để trận đấu này mẫu:

*[. = 'bar'] 
+1

Cảm ơn! Bài đăng khác của bạn cũng hữu ích, vì tiện ích mở rộng tiếp theo sẽ sử dụng cụm từ thông dụng cho lựa chọn: http://stackoverflow.com/questions/539781/xpath-search-based-on-dynamic-regular-expressions – krasnaya

+0

@zhen Không có chi. Chỉ cần nhớ rằng giải pháp RegEx nằm trong XPath 2.0 - không có cách nào thuận tiện để thực hiện điều này trong XPath 1.0 –

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