xsl transform - 删除重复

时间:2012-08-02 20:50:39

标签: c# asp.net xslt

请原谅我之前的类似帖子。希望我能从这些伟大的反馈中学习,但仍然在使用XPath进行一些努力。我再次对相似的帖子感到抱歉!

当前XML

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <table_1 dropdown1="Item1"></table_1>
    <listitems key1="Item1" name="" key2="Id2"/>
    <listitems key1="Item1" name="Item A" key2="Id2"/>
    <listitems key1="Item1" name="Item B" key2="Id2"/>
    <listitems key1="Item1" name="" key2="Id4"/>
    <listitems key1="Item1" name="Item A" key2="Id4"/>
    <listitems key1="Item1" name="Item B" key2="Id4"/>
    <listitems key1="Item2" name="" key2="Id6"/>
    <listitems key1="Item2" name="Item C" key2="Id6"/>
    <listitems key1="Item2" name="Item D" key2="Id6"/>
</data>

当前XSL

               

<xsl:template match="/">
    <html>
        <head>
            <title>Untitled</title>
        </head>
        <body>
            <xsl:for-each select="/data/listitems[@key1=/data/table_1/@dropdown1]">
                <xsl:value-of select="@name"/>                    
                <br/>
            </xsl:for-each>

        </body>
    </html>
</xsl:template>

<xsl:template match="listitems">
    <xsl:value-of select="concat(@name, ' ')" />
</xsl:template>

当前结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

假设您将具有相同<listitems>属性的name元素视为重复项,则可以使用XPath的preceding-sibling轴来忽略任何重复的元素:

<xsl:for-each select="/data/listitems[@key1=/data/table_1/@dropdown1][not(@name = preceding-sibling::listitems/@name)]">

这意味着,您选择了所选的所有项目,并附加限制,即没有任何前面的<listitems>兄弟元素,其name属性与正在测试的元素具有相同的值。