XSL转型疯狂

时间:2012-09-07 11:08:50

标签: xml xslt transformation

我的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代码输出。我无法弄清楚为什么会这样。

1 个答案:

答案 0 :(得分:4)

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

  • 对于元素,处理其节点子项
  • 对于文本节点,请提供其值

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

解决方案是添加模板以匹配 REG_REQUEST 的其他子项,并忽略它们,以便不对元素进行进一步处理

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

这将导致忽略标题以外的所有其他元素。