【发布时间】:2011-02-17 15:38:11
【问题描述】:
我有一个输出为 html 的 XSL 文档。我想运行一个批处理,使用 filelist.xml 对多个 XML 输入文档执行此转换,并带有相应的 html 输出文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" indent="no"/>
<xsl:output method="html" indent="yes" name="html"/>
<xsl:template match="/">
<xsl:for-each select="//*:file">
<xsl:variable select="document(@url)" name="contents" />
<xsl:variable select="replace(@url,'[.]xml','.html')" name="newfile" />
Creating <xsl:value-of select="$newfile" />
<xsl:result-document href="{$newfile}" format="html">
<html><body>
Test run: <xsl:value-of select="$contents/testrun/@run" />
</body></html>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
然后如何将模板应用到这些文件中的每一个,就像我正在处理一个文件一样?即:
<xsl:template match="guidance">
“指导”是我的源 XML 的根节点。这是不正确的,因为我必须嵌套一个模板。解决这个问题的正确方法是什么?
谢谢。
【问题讨论】:
-
如果文件 filelist.xml 是您的样式表的主要输入文件,那么请向我们展示该文件的示例结构。如果此文件链接到您要处理的其他文件,那么还向我们展示您要处理的那些文件的样本。然后显示您要为每个文件创建的输出示例。目前我不确定问题是什么。您当然可以将
<xsl:template match="guidance">...</xsl:template>放入您的样式表中,然后将其应用到例如<xsl:apply-templates select="$contents/guidance"/>在xsl:result-document内。 -
好问题,+1。请参阅我的答案以获得自然而简单的解决方案。
-
您可能会遇到“根规则”的问题:请注意,此规则将匹配任何文档的根文档。因此,不要将模板应用到
$contents文档根目录,而是使用$contents/node()。 -
@martin honnen。谢谢 - 在这种情况下似乎可以解决问题:
<xsl:apply-templates select="$contents/guidance"/>。非常感谢。