在XSLT 1.0中使用select表达式和非空内容的Variable等效

时间:2010-08-06 12:56:03

标签: xml xslt

我有一个模板(我无法更改但必须使用),它处理当前选定的节点,它可能看起来像这样(大大简化):

<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中实现相同的结果?

3 个答案:

答案 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>