从包含XML的变量中删除空标记 - XSLT 2.0

时间:2012-08-09 16:03:02

标签: xslt xslt-2.0

过去我使用单独的转换删除了空标记,如下所示,但现在我必须在同一个XSLT 2.0转换中完成。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*" />
    <xsl:template match="*[not(node()) and not(./@*)]"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

鉴于此XML,我想从策略节点中删除所有空标记。 XML最多可以达到40 MB左右:

<?xml version="1.0" encoding="UTF-8"?>
<myroot>
    <data>
        <data1>abc</data1>
        <data2>123</data2>
    </data>
    <policy>
        <policydata1>Hello World!</policydata1>
        <policydata2/>
    </policy>
</myroot>

我的想法是使用XSLT 2.0我可以在定义为“元素”的变量中保留与策略节点有关的转换输出,因此我可以将其视为XML,然后迭代变量以删除空标记:

    <xsl:variable name="completepolicy" as="element()">
       <policy>
         <policydata1>Hello World!</policydata1>
         <policydata2/>
       </policy>
   </xsl:variable>

如何在变量中合并标记删除而不影响我的变换中的其他模板的答案似乎正在逃避我。你能帮我解决一些可能很明显的问题吗?

注意我提出围绕'policy'输出的变量的原因是我已经声明了它,因为需要从转换中提取一些消息以便在其他地方输出。

2 个答案:

答案 0 :(得分:1)

只需使用原始转化,但替换

<xsl:template match="*[not(node()) and not(./@*)]"/>

<强>与

<xsl:template match="policy/*[not(node()) and not(@*)]"/>

答案 1 :(得分:0)

我不清楚为什么你不能简单地加入规则

<xsl:template match="*[not(node()) and not(./@*)]"/>

在现有样式表中,可能具有更高的优先级。我想这取决于其他模板规则正在做什么。如果您需要在绑定到$ completepolicy的树中存在空节点,然后想要在第二阶段处理中删除它们,我会使用模式执行此操作:模板规则的一种模式应用于每个处理阶段。