XSLT 仅复制某些节点



我有一个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 个不受欢迎的兄弟姐妹列表可能会增加,迫使我不断更新"例外列表",这是一种明显的糟糕方法。 由于我的两个"想要的节点"将永远相同,我希望我的 XSLT 只复制 2 个想要的节点,跳过所有其他兄弟姐妹,使用以下逻辑:

如果匹配 = wanted_node_1匹配 = wanted_node_2则做其他事情跳过不需要的节点结束,如果

我尝试使用诸如

<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>

最新更新