合并2个变量(列表)并删除重复项

时间:2016-10-21 17:20:01

标签: xml xslt xslt-1.0

我有这个xml代码,我想在整个文档中选择<e><z>值,并对它们进行排序而不重复:

<root>
    <a>
        <b>2.7</b>
        <c>
            <d>
                <e>NZ 5222</e>
            </d>
            <d>
                <e>NZ 5223</e>
            </d>
            <d>
                <e>NZ 5224</e>
            </d>
            <d>
                <e>NZ 5225</e>
            </d>
        </c>
    </a>
    <a>
        <b>2.7</b>
        <c>
            <d>
                <e>NZ 5222</e>
            </d>
            <d>
                <e>NZ 611</e>
            </d>
            <d>
                <e>NZ 54</e>
            </d>
            <d>
                <e>NZ 522</e>
            </d>
        </c>
    </a>
    <a>
        <x>
            <y>
                <z>NZ 5222</z>
            </y>
            <y>
                <z>NZ 677</z>
            </y>
        </x>
    </a>
</root>

这个XSL样式表:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match='/'>
               <xsl:variable name="unique-list" select="//e[ancestor::a/b='2.7' and not(.=following::e)]" />
               <xsl:variable name="unique-list2" select="//z[not(.=following::z)]" />

               <xsl:for-each select="$unique-list">
                    <xsl:value-of select="." />
                    <br/>
               </xsl:for-each>
               <xsl:for-each select="$unique-list2">
                    <xsl:value-of select="." />
                    <br/>
                </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

输出是:

NZ 5222
NZ 5223
NZ 5224
NZ 5225
NZ 5222
NZ 611
NZ 54
NZ 522
NZ 5222
NZ 677

所需的排序输出,没有任何重复:

NZ 54
NZ 522
NZ 611
NZ 677
NZ 5222
NZ 5223
NZ 5224
NZ 5225

1 个答案:

答案 0 :(得分:1)

  

我想在整个文档中选择<e><z>值   对它们进行排序,没有任何重复

我建议您使用Muenchian grouping方法来消除重复项。这比你的atttempted方法更有效 - 并且排序也将变得相当微不足道(除了仅通过值的数字部分排序的问题):

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="k" match="e | z" use="." />

<xsl:template match="/root">
    <xsl:for-each select="(a/c/d/e | a/x/y/z)[count(. | key('k', .)[1]) = 1]">
        <xsl:sort select="substring-after(., ' ')" data-type="number" order="ascending"/>
        <xsl:value-of select="." />
        <br/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
  

我只想在祖先的孩子<e>中列出<b>项   <a>等于2.7

然后改变:

<xsl:for-each select="(a/c/d/e | a/x/y/z )[count(. | key('k', .)[1]) = 1]">

为:

<xsl:for-each select="(a[b=2.7]/c/d/e | a/x/y/z )[count(. | key('k', .)[1]) = 1]">

请注意,当祖先<b>的任何<a>等于2.7 &#34;时,这意味着&#34;