2010-07-07 48 views
0

我想從以下XMLXSL跳繩子元素

<person id="101"> 
    <name>XYZ</name> 
    <last-name>XXX</last-name> 
</person> 
<person id="101"> 
    <name>YYY</name> 
    <last-name>BBB</last-name> 
</person> 

假設我想跳過最後的名字,在這裏跳過子元素是我的代碼

<xsl:template match="/"> 
    <xsl:apply-templates select="//person [not(last-name)]" /> 
</xsl:template> 
<xsl:template match="person"> 
<xsl:copy-of select="." /> 
<xsl:text>&#xa;</xsl:text> 
</xsl:template> 

上面的代碼跳過所有具有姓氏元素的人物元素。

任何人都可以幫我使用這段代碼嗎?

感謝

回答

1

通過適當的輸入:

<root> 
    <person id="101"> 
     <name>XYZ</name> 
     <last-name>XXX</last-name> 
    </person> 
    <person id="101"> 
     <name>YYY</name> 
     <last-name>BBB</last-name> 
    </person> 
</root> 

這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="@*|node()"> 
<xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="last-name"/> 
</xsl:stylesheet> 

產生什麼樣的,我認爲是理想的結果:

<root> 
    <person id="101"> 
     <name>XYZ</name> 
    </person> 
    <person id="101"> 
     <name>YYY</name> 
    </person> 
</root> 

注意:恆等變換。空模板去除節點。

+0

謝謝。工作完美! – Maximus 2010-07-07 15:01:46

+0

@ jason4:你好!另外,爲了幫助其他人,請編輯您的問題並明確說明您想剝離「last-name」元素。 – 2010-07-08 13:59:28

1

通過「跳過姓氏」我想你想你的輸出看起來像這樣:

<person id="101"> 
    <name>XYZ</name> 
</person> 
<person id="101"> 
    <name>YYY</name> 
</person> 

在這種情況下,你的方法必須包括所有person元素。一個複製一切,但一個特定的元素的標準方式是這樣的:

<xsl:template match="/"> 
    <xsl:apply-templates select="//person"/> 
</xsl:template> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="last-name"> 
    <!-- Do nothing, you don't want to copy this. --> 
</xsl:template> 

我想你是誤解XPath表達式的工作原理。您的表情//person [not(last-name)]正在選擇匹配條件not(last-name)的所有person元素,這意味着它匹配任何沒有子元素last-name元素的person元素。它的行爲完全如實。

+0

請不要推薦以'//開頭的表達式,因爲它們非常低效。 – 2010-07-07 14:51:27