【问题标题】:XSL transformation going wildXSL 转换变得疯狂
【发布时间】:2012-09-07 11:08:49
【问题描述】:

我的 xsl 转换出了点问题,我看不到问题(是的,新手)。

我有一个 xml:

<REG_REQUEST>
    <header>
        <version/>
        <!-- many tags here -->

        <ref_dtls>
            <ref_doc_num>000111222</ref_doc_num>
            <ref_doc_date>01.01.2000</ref_doc_date>
            <ref_name>Hello world!</ref_name>
        </ref_dtls>
    </header>

    <general_info>
        <dfiState>AGRM</dfiState>
    </general_info>

    <add_info>some additional info here</add_info>
    <!-- many more tags here -->
</REG_REQUEST>

还有一个 xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
    <xsl:output method="html" encoding="utf-8"/>

    <xsl:template match="header">
         <!-- template contents -->
    </xsl:template>
</xsl:stylesheet>

模板本身打印良好,但之后它还会打印所有 xml 属性值的列表。该模板仅包含一些 html 代码输出。我不知道为什么会这样。

【问题讨论】:

    标签: xml xslt transformation


    【解决方案1】:

    这是因为在未提供特定模板时使用的内置模板。它们如下:

    • 对于一个元素,处理它的子节点
    • 对于文本节点,给出它的值

    您尚未为 REG_REQUEST 提供模板,因此内置模板将处理其子项。您有一个用于 header 的模板,因此可以按预期工作,但没有用于 REG_REQUEST 的其他子级的模板。这意味着默认行为开始生效,最终元素和属性的文本值得到输出。

    解决方案是添加一个模板来匹配 REG_REQUEST 的其他子元素,然后忽略它们,这样就不会对元素进行进一步处理

    <xsl:template match="REG_REQUEST/*[not(self::header)]" />
    

    这将导致所有其他元素,除了 header 被忽略。

    【讨论】:

    • TimC,一个元素的内置模板是处理它所有的node子元素——不仅仅是它的子元素。
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2018-08-22
    • 2015-03-25
    相关资源
    最近更新 更多