我在变量中有下面的xml,我需要在xslt 1.0中获得唯一的节点
<out2:PrintRequest>
<Passenger FirstNameNumber="01" LastNameNumber="01"/>
<Passenger FirstNameNumber="01" LastNameNumber="02"/>
<Passenger FirstNameNumber="01" LastNameNumber="01"/>
<Passenger FirstNameNumber="01" LastNameNumber="02"/>
</out2:PrintRequest>
================================= 预期输出:
<out2:PrintRequest>
<Passenger FirstNameNumber="01" LastNameNumber="01"/>
<Passenger FirstNameNumber="01" LastNameNumber="02"/>
</out2:PrintRequest>
答案 0 :(得分:0)
您可以使用Meunchian method进行分组,方法是使用xsl:key
和Passenger
属性中的值为@FirstNameNumber
元素创建一个@LastNameNumber
键的查找值,对每个Passenger
元素进行迭代,如果该元素是从xsl:key
检索到的该组键值的第一个元素,则将其复制。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:out2="out2">
<xsl:output indent="yes"/>
<xsl:key name="passengers-by-num" match="Passenger" use="concat(@FirstNameNumber,@LastNameNumber)"/>
<xsl:template match="out2:PrintRequest">
<xsl:copy>
<xsl:for-each select="Passenger[generate-id() = generate-id(key('passengers-by-num', concat(@FirstNameNumber,@LastNameNumber)[1]))]">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如果您可以使用 XSLT 2.0 (或3.0),那么会容易一些。您可以使用xsl:for-each-group:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:out2="out2">
<xsl:output indent="yes"/>
<xsl:template match="out2:PrintRequest">
<xsl:copy>
<xsl:for-each-group select="Passenger" group-by="concat(@FirstNameNumber,@LastNameNumber)">
<xsl:copy-of select="."/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>