我有一个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>