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



我有这个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

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

我建议您使用Muenchian分组方法来消除重复。这比您尝试的方法要有效得多——而且排序也会变得相当琐碎(除了只按值的数字部分排序的问题):

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>

当祖先的子<b>时,我只想列出<e><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时 "。

相关内容

  • 没有找到相关文章

最新更新