2012-01-22 145 views
1

根據子節點值獲取父節點的XSLT是什麼?使用特定值獲取節點父節點的XSLT

我的XML:

<cast> 
    <character> 
    <name>Bugs</name> 
    <id>1</id> 
    </character> 
    <character> 
    <name>Daffy</name> 
    <id>2</id> 
    </character> 

我已經試過這樣:

<xsl:template match="/cast/character/id"> 
    <xsl:if test="text()=1"> 
     <xsl:apply-templates select="../self" mode='copier'/> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="*" mode='copier'> 
    <xsl:apply-templates /> 
</xsl:template> 

但這輸出文檔中的每個節點的文本。

編輯:我要輸出XML在這裏,我打算將其擴展到XML生成

回答

1

只需使用

<xsl:apply-templates select="/*/character[id=1]"/> 

或者,如果想要的節點應該只是沒有進一步的處理被複制:

<xsl:copy-of select="/*/character[id=1]"/> 
+0

Thx。我將XPath讀爲「根的孩子」,將該字符元素與id元素具有帶整數1的文本節點的子元素一起使用。「是的?如果額外的分支插入到級別的上方,該表達式會中斷id元素? – chernevik

+0

@chernevik:如果對源XML文檔進行了修改,以使「character」元素不再是頂層元素的子元素,則此XPath表達式將不會選擇任何節點並需要進行更改。最好將其再次更改爲特定的XPath表達式,而不是使用「// character」 - 因爲XPath僞操作符可能非常慢(通常會導致整個(子)樹遍歷)。 –

1

我相信你,因爲處理器從根開始匹配,並指定唯一的模板打印一切id元素,所以默認情況下會被複制。試試這個:

<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <output method="text" /> 
    <template match="/"> 
     <apply-templates select="//id" /> 
    </template> 
    <template match="id"> 
     <if test="text()='1'"> 
      <value-of select=".." /> 
     </if> 
    </template> 
</stylesheet> 

或者,如果你只是想在角色名字,你可以在value-of元素與「../name」替換select屬性值。

+0

這並沒有爲我工作,什麼都不輸出。另外,我需要輸出xml。 – chernevik

+0

也嘗試用copy-of替換value-of,並刪除字符串1周圍的單引號。沒有銷售。 – chernevik

+0

從來沒有想過。它__工作,事先的評論反映了一個錯字。對困惑感到抱歉。 – chernevik

0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/cast/character"> 
    <xsl:if test="id=1"> 
     <xsl:copy-of select="." /> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

無法添加評論。因此,把它放在這裏