【问题标题】:XSLT Identity Transformation while removing all attributesXSLT 身份转换同时删除所有属性
【发布时间】:2015-11-20 00:33:16
【问题描述】:

好的,伙计们,又是一个 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()),但我不能同时使用 &lt;xsl:copy-of /&gt;&lt;xsl:apply-templates /&gt;。注意事项:

  • Xalan (JDK 1.7)
  • XSLT 1.0

非常感谢任何帮助!

【问题讨论】:

    标签: xml xslt xslt-1.0 xalan


    【解决方案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

    【讨论】:

    • 非常感谢先生!我是如此专注于一个模板匹配,以至于我从来没有想过不止一次匹配。这在 Xalan 中也能完美运行。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    相关资源
    最近更新 更多