2013-01-02 30 views
6

Có thể kiểm tra loại nút mà tôi đã khớp với mẫu bên trong cùng một mẫu không? Trong trường hợp nó là, làm thế nào tôi có thể làm điều đó? Ví dụ tôi muốn làm một cái gì đó như thế này:Kiểm tra loại nút trong mẫu XSL

<xsl:template match="@*|node()"> 
    <xsl:choose> 
     <xsl:when test="current() is an attribute"> 
     <!-- ... --> 
     </xsl:when> 
     <xsl:when test="current() is an element"> 
     <!-- ... --> 
     </xsl:when> 
     <xsl:otherwise> 
     <!-- ... --> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+1

Tim đã đưa ra một câu trả lời hay nhưng tôi tự hỏi tại sao bạn cần làm điều này bên trong mẫu và lý do tại sao bạn không chỉ viết mẫu phù hợp cụ thể hơn với các mẫu riêng biệt cho các loại nút khác nhau. –

+0

Tôi quan tâm đến nó vì mục đích giáo dục. Tôi đang xây dựng một phép chuyển đổi XSL để làm nổi bật các nút được khớp với các biểu thức XPath trong một tài liệu XML. Trong một ứng dụng thực tế tôi sẽ không làm điều đó. – hielsnoppe

Trả lời

17

Hãy xem câu trả lời này đây, vì điều này sẽ cung cấp cho bạn những thông tin bạn cần:

Difference between: child::node() and child::*

Điều này cho phép sau xsl: chọn để kiểm tra tất cả các nút, bao gồm nút tài liệu.

<xsl:choose> 
    <xsl:when test="count(.|/)=1"> 
    <xsl:text>Root</xsl:text> 
    </xsl:when> 
    <xsl:when test="self::*"> 
    <xsl:text>Element </xsl:text> 
    <xsl:value-of select="name()"/> 
    </xsl:when> 
    <xsl:when test="self::text()"> 
    <xsl:text>Text</xsl:text> 
    </xsl:when> 
    <xsl:when test="self::comment()"> 
    <xsl:text>Comment</xsl:text> 
    </xsl:when> 
    <xsl:when test="self::processing-instruction()"> 
    <xsl:text>PI</xsl:text> 
    </xsl:when> 
    <xsl:when test="count(.|../@*)=count(../@*)"> 
    <xsl:text>Attribute</xsl:text> 
    </xsl:when> 
</xsl:choose> 
+1

Tốt, nhưng bạn đã bỏ lỡ các nút không gian tên. –

6

Một cách chính xác hơn để xác định xem nút $nodemột nút gốc:

not(count($node/ancestor::node())) 

Khái niệm trong câu trả lời TimC của kiểm tra kiểu của nút hiện tại:

count(.|/)=1 

nhưng không áp dụng được trong trường hợp chúng tôi muốn xác định loại nút trong biến - có thể thuộc về một tài liệu khác - không phải tài liệu hiện tại.

Ngoài ra, một thử nghiệm cho một nút namespace:

count($node | $node/../namespace::*) = count($node/../namespace::*) 
Các vấn đề liên quan