根据属性值xslt 1.0获取唯一节点

时间:2019-01-25 01:10:52

标签: xslt xpath

我在变量中有下面的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>

1 个答案:

答案 0 :(得分:0)

您可以使用Meunchian method进行分组,方法是使用xsl:keyPassenger属性中的值为@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>