Xml XSL转换变得疯狂

Xml XSL转换变得疯狂,xml,xslt,transformation,Xml,Xslt,Transformation,我的xsl转换出了问题,我看不出问题所在(是的,新手) 我有一个xml: <REG_REQUEST> <header> <version/> <!-- many tags here --> <ref_dtls> <ref_doc_num>000111222</ref_doc_num> <ref_doc_

我的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>

000111222
01.01.2000
你好,世界!
阿格姆
这里有一些额外的信息
和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代码输出。我不明白为什么会发生这种情况。

这是因为没有提供特定模板时会使用内置模板。详情如下:

  • 对于元素,处理其节点子级
  • 对于文本节点,请指定其值
您尚未为REG\u请求提供模板,因此内置模板将处理其子项。您有一个用于header的模板,因此将按预期工作,但没有用于REG\u REQUEST的其他子级的模板。这意味着默认的behviour开始生效,最终元素和属性的文本值得到输出

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

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


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

这是因为未提供特定模板时使用内置模板。详情如下:

  • 对于元素,处理其节点子级
  • 对于文本节点,请指定其值
您尚未为REG\u请求提供模板,因此内置模板将处理其子项。您有一个用于header的模板,因此将按预期工作,但没有用于REG\u REQUEST的其他子级的模板。这意味着默认的behviour开始生效,最终元素和属性的文本值得到输出

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

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


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

TimC,元素的内置模板将处理其所有节点子元素,而不仅仅是其子元素。TimC,元素的内置模板将处理其所有节点子元素,而不仅仅是其子元素。