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>
我有一个看起来像这样的 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>