Xsl:复制For Each而忽略所有不包含某种类型节点的节点

时间:2016-11-16 14:57:27

标签: xml xslt

<xsl:output indent="yes"/>

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

<xsl:template match="root">
    <xsl:copy>
        <xsl:for-each-group select="RemittanceInformation" group-by="IndividualRemittance/ExchangeAssignedPolicyID">
          <xsl:copy>
              <xsl:variable name="pos" select="position()"/>
              <xsl:apply-templates select="EntityAssignedNumber, IndividualRemmittance, current-group()/RemittanceDetail">
                  <xsl:with-param name="pos" select="$pos"/>
              </xsl:apply-templates>
          </xsl:copy>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

<xsl:template match="EntityAssignedNumber">
    <xsl:param name="pos"/>
    <xsl:copy>
        <xsl:value-of select="/root/RemittanceInformation[1]/EntityAssignedNumber + $pos - 1"/>
    </xsl:copy>
</xsl:template>

我从S / O上的超级有用的martin-honnen获得了这个代码,但有一点不做的是,当RemittanceInformation类型的节点没有IndividualRemmittance时,它根本不会复制它。

我想要的是当有个人转移时,将它们组合在一起以便没有重复(代码已经这样做了),但是当它遇到没有IndividualRemmittance的RemittanceInformation时,它应该正常复制它。

我需要改变什么才能实现这一目标?

1 个答案:

答案 0 :(得分:1)

感谢Tomalak的帮助,我做到了! :d

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output indent="yes"/>

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

  <xsl:template match="root">
     <xsl:variable name="countComp" select="count(//RemittanceInformation[not(IndividualRemittance)])"/>
     <xsl:copy>
      <xsl:for-each select="RemittanceInformation[not(IndividualRemittance)]">
        <xsl:variable name="pos" select="position()"/>
        <xsl:copy>
          <xsl:apply-templates select="@* | node()">
            <xsl:with-param name="pos" select="$pos"/>
          </xsl:apply-templates>
        </xsl:copy>
      </xsl:for-each>

      <xsl:for-each-group select="RemittanceInformation" group-by="IndividualRemittance/ExchangeAssignedPolicyID">
        <xsl:copy>
          <xsl:variable name="pos" select="position()"/>
          <xsl:apply-templates select="EntityAssignedNumber, IndividualRemittance, current-group()/RemittanceDetail">
            <xsl:with-param name="pos" select="$pos+$countComp"/>
          </xsl:apply-templates>
        </xsl:copy>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="EntityAssignedNumber">
    <xsl:param name="pos"/>
    <xsl:copy>
      <xsl:value-of select="/root/RemittanceInformation[1]/EntityAssignedNumber + $pos - 1"/>
    </xsl:copy>
  </xsl:template>
</xsl:transform>