我有一个模板(我无法更改但必须使用),它处理当前选定的节点,它可能看起来像这样(大大简化):
<xsl:template name="foreignTemplate">
<xsl:value-of select="." />
</xsl:template>
在XSLT 2.0中我可以做这样的事情来绑定“。”在该模板中的任意变量:
<xsl:template match="dummyNode">
<xsl:variable name="inputString">foobar</xsl:variable>
<xsl:variable name="result" select="$inputString">
<xsl:call-template name="foreignTemplate" />
</xsl:variable>
</xsl:template>
鉴于此源文件:
<?xml version="1.0"?>
<dummyNode>DUMMY TEXT</dummyNode>
使用XSLT 2.0处理器应用上述转换将评估为“foobar”。
但是,在XSLT 1.0中,xsl:variable-Elements不能同时具有select属性并且不为空。如何在XSLT 1.0中实现相同的结果?
答案 0 :(得分:1)
在XSLT 1.0 xsl:variable-Elements中 不能有一个select属性 非空的同时
首先,同样适用于XSLT 2.0 (对于每个具有@select且允许XSLT 2.0中的序列构造函数的指令)
其次,如果要在调用名称模板之前更改上下文节点(或XSLT 2.0中的上下文项),则应执行以下操作:
<xsl:for-each select="$here-the-context-you-want">
<xsl:call-template name="foreignTemplate" />
</xsl:for-each>
答案 1 :(得分:1)
在XSLT 2.0中,我可以做类似的事情 这要绑定“。”在那个模板中 任意变量:
<xsl:template match="dummyNode"> <xsl:variable name="inputString">foobar</xsl:variable> <xsl:variable name="result" select="$inputString"> <xsl:call-template name="foreignTemplate" /> </xsl:variable> </xsl:template>
这不是真的。
在XSLT 1.0和2.0中,<xsl:variable>
都可以有select
属性或正文(序列构造函数),但两者同时存在错误。
来自XSLT 2.0 spec :“[ERR XTSE0620]如果变量绑定元素具有select属性并且具有非空内容,那么这是一个静态错误< / EM>“。
我会推荐以下写作风格:
在XSLT 1.0中:不要依赖上下文节点作为隐式参数。使用显式参数:
<xsl:template name="foreignTemplate">
<xsl:param name="pElement" />
<xsl:value-of select="$pElement" />
</xsl:template>
并在另一个模板中调用它:
<xsl:call-template name="foreignTemplate">
<xsl:with=param name="pElement" select="someExpression"/>
</xsl:call-template>
在XSLT 2.0中:使用<xsl:function>
代替<xsl:template>
:
<xsl:function name="my:foo" as="xs:string">
<xsl:param name="pElement" as="element()"/>
<xsl:sequence select="string($pElement)"/>
</xsl:function>
并将其称为任何XPath表达式的一部分:
my:foo(someElement)
答案 2 :(得分:0)
要将模板应用于常量字符串,您可以使用样式表中包含的节点集,并使用document
函数访问它。使用空字符串作为参数,结果是样式表文档本身。
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://stackoverflow.com/questions/3423923/">
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<foo:data>foobar</foo:data>
<xsl:template name="foreignTemplate">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="document('')/xsl:stylesheet/foo:data">
<xsl:call-template name="foreignTemplate" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>