2011-04-20 75 views
3

子節點我想模板應用到具有特定屬性的子節點,我很好奇,如果有可能有<template match=...應用模板到具有與屬性

所以,如果我有一個輸入XML

<?xml version="1.0"?> 
<parent-node> 
    <child-node> 
     <label>value1</label> 
     <name>name1</name> 
     <desc src="anything">description1</desc> 
    </child-node> 
    <child-node> 
     <label>value2</label> 
     <desc>description2</desc> 
    </child-node> 
    <some-node> 
     <name>name3</name> 
     <desc src="something">description3</desc> 
    </some-node> 
</parent-node> 

所需模板將被應用於具有desc兒童定義src屬性,例如,節點。第一個和最後一個節點:

<child-node> 
    <label>value1</label> 
    <name>name1</name> 
    <desc src="anything">description1</desc> 
</child-node> 
<some-node> 
    <name>name3</name> 
    <desc src="something">description3</desc> 
</some-node> 

盡我至今是一個模板匹配有desc孩子節點,其餘的(測試是否有任何desc節點有@src)是模板裏面,一個xsl:choose條款:

<xsl:template match="*[desc]"> 
    <xsl:choose> 
     <xsl:when test="desc[@src]"> 
      <xsl:element name="node-with-src"> 
       [...] 
      </xsl:element> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:element name="node"> 
       [...] 
      </xsl:element> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

通過具有這樣的模板,我可以離開,但該模板裏面的otherwise一部分,無論如何,這將是一個要好很多。

預先感謝您的每一個答案!

編輯 我更喜歡1.0解決方案,但它不是一個標準。

回答

5

允許使用更復雜的(嵌套的)謂詞。使用此:

<xsl:template match="*[desc[@src]]"> 

而且對於節點相應的模板沒有src屬性:

<xsl:template match="*[desc[not(@src)]]"> 

例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="*[desc[@src]]"> 
     <xsl:element name="node-with-src"/> 
    </xsl:template> 
    <xsl:template match="*[desc[not(@src)]]"> 
     <xsl:element name="node"/> 
    </xsl:template> 
</xsl:stylesheet> 

適用於:

<parent-node> 
    <child-node> 
     <label>value1</label> 
     <name>name1</name> 
     <desc src="anything">description1</desc> 
    </child-node> 
    <child-node> 
     <label>value2</label> 
     <desc>description2</desc> 
    </child-node> 
    <some-node> 
     <name>name3</name> 
     <desc src="something">description3</desc> 
    </some-node> 
</parent-node> 

輸出:

<node-with-src/> 
<node/> 
<node-with-src/> 
+1

太棒了!非常感謝你,主要是這個'''部分,我因爲它而瘋了,而且我不能正確地說出問題! – rekaszeru