XSLT只允许通过重复记录

时间:2012-03-09 09:16:38

标签: xml xslt

是否可以在speicif字段上进行过滤,然后当两个字段相同时,只允许这两个层次结构通过。我的意思是:

输入数据:

<?xml version="1.0" encoding="UTF-8"?>
<payload>
    <set>
        <field1>compare</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
    <set>
        <field4>compare</field4>
        <field5>put through</field5>
        <field6>this too</field6>
    </set>
    <set>
        <field1>compare1</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
    <set>
        <field4>compare2</field4>
        <field5>put through</field5>
        <field6>this too</field6>
    </set>
    <set>
        <field1>compare2</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
</payload>

然后将field1与sind内容进行比较,使“compare”和“compare2”相同,只让这四个通过,所以输出如下:

<?xml version="1.0" encoding="UTF-8"?>
<payload>
    <set>
        <field1>compare</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
    <set>
        <field4>compare</field4>
        <field5>put through</field5>
        <field6>this too</field6>
    </set>
    <set>
        <field4>compare2</field4>
        <field5>put through</field5>
        <field6>this too</field6>
    </set>
    <set>
        <field1>compare2</field1>
        <field2>info</field2>
        <field3>more infor</field3>
    </set>
</payload>

你如何编写一个XSLT进行比较,只让匹配?

1 个答案:

答案 0 :(得分:2)

是否要将每个set元素的第一个子元素与其他set元素的第一个子元素进行比较? 如果我理解正确,那么使用XSLT 1.0,您可以使用

中的密钥
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="k1" match="set" use="*[1]"/>

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

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

<xsl:template match="payload">
  <xsl:copy>
    <xsl:apply-templates select="set[key('k1', *[1])[2]]"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

使用XSLT 2.0,你可以做得更短:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="k1" match="set" use="*[1]"/>

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

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

<xsl:template match="set[not(key('k1', *[1])[2])]"/>

</xsl:stylesheet>
相关问题