XSLT仅复制某些节点

时间:2019-09-20 13:18:52

标签: xml xslt siblings

我有一个看起来像这样的XML输入:

 <root>
      <NFe>
        <infNFe>
          <wanted_node_1>
            <stuff>1111111</stuff>
          </wanted_node_1>

          <wanted_node_2>
            <stuff>2222222</stuff>
          </wanted_node_2>

          <unwanted_node_1>
            <stuff>aa</stuff>
          </unwanted_node_1>

         ...

          <unwanted_node_25>
            <stuff>zz</stuff>
          </unwanted_node_25>

        </infNFe>
      </NFe>

    </root>

我希望输出结果是一个XML文件,仅带有两个同级兄弟“ 想要的节点

<root>
  <NFe>
    <infNFe>

      <wanted_node_1>
        <stuff>1111111</stuff>
      </wanted_node_1>

      <wanted_node_2>
        <stuff>2222222</stuff>
      </wanted_node_2>

    </infNFe>
  </NFe>
</root>

我不想复制其他25个兄弟姐妹“ 不需要的节点”。我是XSL的新手,我编写的代码通过创建一个包含所有不需要的同级元素的25个元素长的异常列表来处理它:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes"
              indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="wanted_node_1 | wanted_node_2 ">
    <xsl:element name="{name()}">
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>

  <!--exceptions list-->
  <xsl:template match="unwanted_node_1 | unwanted_node_2 | unwanted_node_3 | ... | unwanted_node25 "/>

</xsl:stylesheet>

我的问题是,当前25个多余的兄弟姐妹列表可能会增加,这迫使我继续更新“例外列表”,这显然是一种不好的方法。由于我的两个“ 需要的节点”将始终相同,因此我希望我的XSLT使用以下逻辑仅复制跳过两个其他同级节点的两个想要的节点:

如果 match = wanted_node_1 match = wanted_node_2 然后     做东西 其他     跳过不需要的节点 结束

我尝试使用

之类的方法处理例外列表
  <xsl:template match="not(self::wanted_node_1) and not(self::wanted_node_2)>

具有许多括号位置,大括号等的排列,但始终会收到错误消息。然后如何将XML输出限制为仅2个所需节点,而又不创建25个多余的兄弟姐妹列表?

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

使用<xsl:template match="infNFe/*[not(self::wanted_node_1 | self::wanted_node_2)]"/>

答案 1 :(得分:0)

您可以简单地做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="infNFe">
    <xsl:copy>
        <xsl:apply-templates select="wanted_node_1 | wanted_node_2"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>