我有一个看起来像这样的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个多余的兄弟姐妹列表?
任何帮助将不胜感激。谢谢!
答案 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>