在XSLT中返回不同的节点

时间:2015-01-23 14:22:52

标签: xml xslt xslt-grouping

我需要有关如何循环每个唯一节点的帮助" set"。我期望的结果是独特的集合。我尝试了许多不同的方法,但没有尝试。似乎我总是得到所有结果,或者没有结果。

 <Res>
        <ResQ>
            <set>
                <No>1</No>
                <Desc>test</Desc>
                <Num>123</Num>
            </set>
            <set>
                <No>2</No>
                <Desc>test</Desc>
                <Num>111</Num>
            </set>
            <set>
                <No>3</No>
                <Desc>test</Desc>
                <Num>100</Num>
            </set>
        </ResQ>
    </Res>
    <Res>
        <ResQ>
            <set>
                <No>1</No>
                <Desc>test</Desc>
                <Num>333</Num>
            </set>
            <set>
                <No>2</No>
                <Desc>test</Desc>
                <Num>123</Num>
            </set>
            <set>
                <No>3</No>
                <Desc>test</Desc>
                <Num>555</Num>
            </set>
        </ResQ>
    </Res>

我已经尝试了这一点,但没有取得预期的结果。

<xsl:key name="keyTest" match="//set" use="concat(No, '+', Desc,'+',Num)"/> 

<xsl:for-each select="//set[generate-id(.) = generate-id(key('keyTest', concat(No, '+', Desc,'+',Num))[1])]" >
        <xsl:call-template name="row">
                    <xsl:with-param name="rb" select="No" />
                    <xsl:with-param name="desc" select="Desc" />
                    <xsl:with-param name="number" select="Num" />
         </xsl:call-template>
</xsl:for-each>

1 个答案:

答案 0 :(得分:2)

如果当两个集合具有相同的Num时被视为等于,则应该在密钥声明及其使用中仅使用该元素(否则,我没有&#t; t理解这个问题,我的答案毫无用处):

<xsl:key name="keyTest" match="//set" use="Num"/>
...
<xsl:for-each select="//set[generate-id(.) = generate-id(key('keyTest', Num)[1])]" >
    <xsl:call-template name="row">
        <xsl:with-param name="rb" select="No" />
        <xsl:with-param name="desc" select="Desc" />
        <xsl:with-param name="number" select="Num" />
    </xsl:call-template>
</xsl:for-each>