如何强制XSLT转换遵循文档顺序?

时间:2014-06-26 21:34:18

标签: xml xslt msxsl

所以我正在编写一个XSLT转换来将XML文件解析为HTML。有一段时间,一切都进展顺利。但是,我遇到了一个问题。基本上,似乎没有遵循我期望的顺序。

在转换中有一些看起来像这样的代码。

<xsl:template match="/"
<html>
    <head></head>
    <body>
        <h1>Summary</h1>
        <table>
            <xsl:apply-templates select="theItem"/>
        </table>
    </body>
</html>
</xsl:template>
<xsl:template match="theItem"/>
    <tr><td>Column1</td><td>Column2</td></tr>
</xsl:template>

我期望这样做是建立一个表格,并为模板的每个匹配填一行。

它的作用是打开并关闭表格,然后将所有行放在后面。这样的事情。

<table></table>
<tr>
    <td>
        Column1
    </td>
    <td>
        Column2
    </td>
</tr>
<tr>
    <td>
        Column1
    </td>
    <td>
        Column2
    </td>
</tr>

那到底发生了什么?我不确定它是否重要,但我使用msxsl进行转换。我也尝试在数据中嵌入转换并在IE中打开它。创建相同的问题。我看不出任何方式这是预期的行为,但也许有些东西我不知道。

修改

请注意,我可以将模板应用程序包装在任意类型的任意数量的标签中,并且在显示任何模板信息之前打开和关闭它们。

1 个答案:

答案 0 :(得分:1)

虽然在大多数情况下,这个问题已经过时,但如果有人发现类似的错误,我想澄清这个问题。

发生了什么事

<xsl:apply-templates select="theItem"/>

在示例代码中调用时没有匹配任何内容。所以它没有产生任何东西(如你所料)。但是,稍后在代码中确实与

匹配
<xsl:template match="theItem"/>
    <tr><td>Column1</td><td>Column2</td></tr>
<xsl:template>

并插入所有行,就像它应该的那样。这产生了不希望的效果。

如果有人见过这种行为,那就是我要看的第一个地方。确保您的模板实际上是在您预期的时候调用的,而不是其他时间。这可能会导致模板的无序应用。感谢所有帮助我找到解决方案的人。