是否可以在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进行比较,只让匹配?
答案 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>