删除所有属性时的XSLT标识转换

时间:2015-11-20 00:33:16

标签: xml xslt xslt-1.0 xalan

好的人,还有另一个XSLT问题。这个转换包括我在2个不同的XSLT中单独工作的2个动作,但我不能为我的生活结合起来。

我正在尝试创建一个选择节点集的身份转换,并且还会删除所有属性。以下是我正在使用的内容:

数据:

<?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 />和{{1一起来。注意事项:

  • Xalan(JDK 1.7)
  • XSLT 1.0

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

而不是在第一个XSLT中使用xsl:copy-of,而xsl:apply-templates可以选择第二个XSLT中的模板(一次与第一个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