XSLT:如果没有输入文件,如何触发模板?

时间:2009-08-03 19:35:25

标签: xslt

我正在创建一个模板,该模板基于单个字符串生成输出,通过参数传递,并且不使用输入XML文档。 xsltproc似乎很乐意使用指定样式表的单个参数运行,但我没有看到在没有输入文件的情况下触发模板的方法(没有参数xsltproc来运行命名模板,例如)。

我希望能够运行:

xsltproc --stringparam bar baz foo.xsl

但我现在必须运行,“main”模板匹配“/”:

echo '<xml/>' | xsltproc --stringparam bar baz foo.xsl -

我怎样才能让它发挥作用?我确定我过去看过其他模板,这些模板本来是在没有输入文档的情况下运行的,但是我不记得它们是如何工作的或者在哪里再次找到它们。 : - )

2 个答案:

答案 0 :(得分:9)

实际上,这种情况经常发生。

XSLT 2.0中,它在规范中定义。提供初始上下文节点是可选的。 如果没有提供初始上下文节点(没有源XML文档),则提供要作为转换入口点执行的命名模板的名称非常重要。

XSLT 1.0 中,可以为转换提供自己的主样式表模块(文件)作为源XML文档,当然,转换可以完全忽略此源XML文档。很久以前Jeni Tennison已经证明并使用了这种技术。

例如:

<?xml-stylesheet type="text/xsl" href="example.xml"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
      <p>Hello, world!</p>
    </xsl:template>
</xsl:stylesheet>

当上述代码保存在名为“example.xml”的文件中,然后使用Windows资源管理器显示文件夹内容时,双击文件“example.xml”将打开IE并生成:

你好,世界!

答案 1 :(得分:1)

通常,您无法使用XSLT执行此操作 - 规范要求输入文档,并且处理要从将任何可用模板应用于其根节点开始。一些XSLT处理器可能会提供一种方法来执行您想要的操作(例如,执行命名模板)作为扩展,但我不知道任何这样的,并且似乎xsltproc不是其中之一,从其手册页判断

事实上,这听起来非常可疑,因为使用XSLT从普通字符串输入产生一些输出的目的尚不清楚 - 这不是它通常擅长的任务。