0

我有一个简单的问题,我真的找不到解决方法,我需要你的帮助。

主要问题是,在处理输入 XML 时,我需要在多个地方“收集”信息。这意味着我真正需要做的就是调用一个带有如下参数的特殊模板:

<xsl:template name="append-section">
        <xsl:param name="id" />
        <xsl:param name="title" />
        <!-- more code here -->
</xsl:template>

假设这个模板在 XSLT 过程中被调用了 12 次。在转换结束时,我想将此数据写入文件。

我试图将此数据附加到全局变量中,然后将结果写入文件。在 XSLT 中只实现变量并不是真正的变量。该解决方案不起作用。

第二种解决方案是将 xsl:result-document 与一个临时文件一起使用。这个解决方案会做一些事情,比如总是将文件的先前内容复制到自己,但也会像这样附加新数据:

<xsl:template name="append-section">
        <xsl:param name="id" />
        <xsl:param name="title" />
        <xsl:result-document method="html" href="tmp/tmp.html">

            <xsl:value-of select="document(tmp.html)" />
            <xsl:element name="li">
                <xsl:element name="a">
                    <xsl:attribute name="class">
                        <xsl:value-of select="'so-dropdown-page-menu-list-button'" />
                    </xsl:attribute>
                    <xsl:attribute name="href">
                        <xsl:value-of select="'#'" />
                        <xsl:value-of select="$id" />
                    </xsl:attribute>
                    <xsl:value-of select="$title" />
                </xsl:element>
            </xsl:element>
        </xsl:result-document>
    </xsl:template>

这段代码可能并不完美,但不幸的是我不得不意识到抛出了以下异常:

Cannot write more than one result document to the same URI

该解决方案似乎也无效。

所以我的问题是:如何实现这个简单的问题?从各个地方收集数据并在转换结束时将它们写入文件。

我用撒克逊。

4

1 回答 1

1

您需要根据输出的结构而不是输入的结构来构建代码。当你在输入中遇到信息时,不要试图做事情;当您需要生成相关的输出时执行它们。

在某些情况下,这似乎效率低下,因为这意味着多次访问相同的输入。通常这些低效率将被证明是明显的而不是真实的。但首先是让转型发挥作用;如果速度不够快,您可以向我们提出另一个问题。

于 2013-07-18T20:54:59.460 回答