2012-12-11 232 views
2

XML:如何通過模板xslt從子節點獲取祖父節點的屬性?

<Grandparent> 
    <Parent> 
    <Children id ="1"> 
     <Info> 
     <Name> 
      <label name ="chname" /> 
     </Name> 
     </Info> 
    </Children> 
    <Children name ="2"> 
     <Info> 
     <Name> 
      <label name="chname" /> 
     </Name> 
     </Info> 
    </Children> 
    <Children id ="3"> 
     <Info> 
     <Name> 
      <label name="chname" /> 
     </Name> 
     </Info> 
    </Children> 
    </Parent> 
</Grandparent> 

XSLT:

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

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

<xsl:template match="label"> 
    <label id="../../../preceding-sibling::Children/@id"> 
    <xsl:apply-templates select="@*|node()"/> 
    </label> 
</xsl:template> 

</xsl:stylesheet> 

預期輸出:

<Grandparent> 
     <Parent> 
     <Children id ="1"> 
      <Info> 
      <Name> 
       <label id="1" name ="chname" /> 
      </Name> 
      </Info> 
     </Children> 
     <Children name ="2"> 
      <Info> 
      <Name> 
       <label id="2" name="chname" /> 
      </Name> 
      </Info> 
     </Children> 
     <Children id ="3"> 
      <Info> 
      <Name> 
       <label id="3" name="chname" /> 
      </Name> 
      </Info> 
     </Children> 
     </Parent> 
    </Grandparent> 

林添加屬性ID爲 「標籤」 標籤通過模板。我如何從兒童節點獲得屬性「ID」?這是我的代碼

<label id="../../../preceding-sibling::Children/@id"> 

它不起作用。我在這裏錯過了什麼嗎?

在此先感謝:)

+1

你的第二個孩子** **元具有**名稱**屬性,而不是** ** ** **屬性。它是否正確? –

回答

3

如果你想有一個XPath表達式作爲屬性的結果,你需要使用屬性值模板,所以你應該這樣寫它

<label id="{../../../preceding-sibling::Children/@id}"> 

花括號表明它是一個要評估的表達式,而不是字面輸出的字符串。

但是,我認爲表達式在這種情況下是錯誤的。你應該實際上做這個:

<label id="{../../../@id}"> 

以下是完整的XSLT

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

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

<xsl:template match="label"> 
    <label id="{../../../@id}"> 
    <xsl:apply-templates select="@*|node()"/> 
    </label> 
</xsl:template> 

</xsl:stylesheet> 

當適用於您的XML,下面是輸出

<Grandparent> 
    <Parent> 
     <Children id="1"> 
     <Info> 
      <Name> 
       <label id="1" name="chname"/> 
      </Name> 
     </Info> 
     </Children> 
     <Children name="2"> 
     <Info> 
      <Name> 
       <label id="" name="chname"/> 
      </Name> 
     </Info> 
     </Children> 
     <Children id="3"> 
     <Info> 
      <Name> 
       <label id="3" name="chname"/> 
      </Name> 
     </Info> 
     </Children> 
    </Parent> 
</Grandparent> 
+0

感謝它的工作:) – iCeR

2

您可以使用AVT

<label id="{../../../@id}">