删除所有属性时的 XSLT 身份转换

XSLT Identity Transformation while removing all attributes

好的伙计们,又是一个 XSLT 问题。此转换包含 2 个操作,我在 2 个不同的 XSLT 中单独工作,但我无法将它们结合起来。

我正在尝试创建一个选择节点集并删除所有属性的身份转换。这是我正在处理的内容:

数据:

<?xml version="1.0" encoding="UTF-8"?>
<doc>
    <meta>
        <data>
            <uselessMeta>SomeValue</uselessMeta>
        </data>
    </meta>
    <dataWrapper>
        <data xmlns:xfa="http://www.w3.org/1999/xhtml">
            <neededData1 meanAttribute="NotWanted">TransformMe!</neededData1>
            <neededData2 meanAttribute="NotWanted">TransformMe!</neededData2>
        </data>
    </dataWrapper>
</doc>

XSLT 1(身份转换):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0" >
    <xsl:output omit-xml-declaration="no" method="xml" indent="no"/>
    <xsl:template match="/">
        <xsl:copy>
            <xsl:copy-of select="//dataWrapper/data[text() != '']" />
        </xsl:copy>
    </xsl:template>
</xsl:transform>

XSLT 2:XSLT - remove all attributes

想要的结果:

<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:xfa="http://www.w3.org/1999/xhtml">
        <neededData1>TransformMe!</neededData1>
    <neededData2>TransformMe!</neededData2>
</data>

问题似乎是我试图匹配根 (/) 或所有节点 (node()) 但我不能使用 <xsl:copy-of /><xsl:apply-templates />在一起。注意事项:

非常感谢任何帮助!

不是在第一个 XSLT 中使用 xsl:copy-of,而是 xsl:apply-templates 然后可以 select 第二个 XSLT 中的模板(一旦与第一个合并)。 xsl:copy-of 只复制现有节点,不做任何更改或应用任何其他模板。

试试这个 XSLT:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
    <xsl:output omit-xml-declaration="no" method="xml" indent="no"/>

    <xsl:template match="/">
        <xsl:copy>
            <a>
                <xsl:apply-templates select="//dataWrapper/data[text() != '']" />
            </a>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="node()">
        <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*"/>
</xsl:transform>

请注意,我已从身份模板中删除 @* 上的匹配项,因此它只匹配 node()。某些处理器可能会将两个模板以相同的优先级匹配相同的事物作为错误,尽管它们也可能会选择最后一个匹配的模板。 (参见 http://www.w3.org/TR/xslt#conflict