我有一个简单的问题,我无法找到解决方法,我需要你的帮助。
主要问题是,在处理输入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。
答案 0 :(得分:1)
您需要根据输出的结构而不是输入的结构来构造代码。当您在输入中遇到信息时,不要尝试做事情;当你需要生成相关的输出部分时执行它们。
有些情况下,这似乎效率低下,因为这意味着不止一次访问相同的输入。通常这些低效率将证明是明显的而不是真实的。但首先是让转型运转起来;如果它不够快,你可以回答我们另一个问题。