XSLT收集数据

时间:2013-07-18 16:15:41

标签: java xml xslt xpath

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

主要问题是,在处理输入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

此解决方案似乎也无效。

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

我使用Saxon。

1 个答案:

答案 0 :(得分:1)

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

有些情况下,这似乎效率低下,因为这意味着不止一次访问相同的输入。通常这些低效率将证明是明显的而不是真实的。但首先是让转型运转起来;如果它不够快,你可以回答我们另一个问题。