2011-11-20 212 views
4

這讓我瘋狂,因爲像我這樣的xslt新手。XSLT選擇獨特節點

輸入:

<root> 
    <a><name>kyle</name></a> 
    <b><name>stan</name></b> 
    <b><name>wendy</name></b> 
    <b><name>cece</name></b> 
</root> 

預期輸出:

<root> 
     <a><name>kyle</name></a> 
     <b><name>stan</name></b> 
</root> 

我被要求退還根據 '根' 第一唯一節點,我該怎麼做呢?

xslt 1.0或2.0都可以。

非常感謝你!!!!

回答

1

XSLT 2.0溶液:

<?xml version="2.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
    <root> 
    <xsl:for-each-group select="root/*" group-by="local-name()"> 
     <xsl:copy-of select="."/> 
    </xsl:for-each-group> 
    </root> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <a> 
     <name>kyle</name> 
    </a> 
    <b> 
     <name>stan</name> 
    </b> 
</root> 
1

您可以匹配具有相同名稱的前面兄弟的任何元素,而不輸出任何內容。

例XSLT:

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

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

    <xsl:template match="/*/*[preceding-sibling::*[name() = current()/name()]]"/> 

</xsl:stylesheet> 

輸出(使用撒克遜9 HE):

<root> 
    <a> 
     <name>kyle</name> 
    </a> 
    <b> 
     <name>stan</name> 
    </b> 
</root>