XSLT 仅复制某些节点

XSLT to copy only certain nodes

我有一个看起来像这样的 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 文件,其中只有 2 个兄弟姐妹“想要的节点”这样

<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 个兄弟姐妹“unwanted_nodes”。我是 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 个不想要的兄弟姐妹列表可能会增加,迫使我不断更新 "exceptions list",这是一个明显的错误方法。由于我的两个“想要的节点”将始终相同,我希望我的 XSLT 只复制 2 个想要的节点,跳过所有其他兄弟节点,使用这样的逻辑:

if match = wanted_node_1 or match = wanted_node_2 then 做事 其他 跳过不需要的节点 如果

结束

我尝试使用

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

括号位置、大括号等有很多排列组合,但总是收到错误消息。那么如何将 XML 输出限制为仅 2 个想要的节点而不创建 25 长的不需要的兄弟节点列表?

如有任何帮助,我们将不胜感激。谢谢!

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

你可以简单地做:

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>