2015-11-20 65 views
0

为什么我会得到真正的从该模板返回值:模板返回true()时,被告知要返回false

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
 
\t <xsl:template name="return-false"> 
 
\t \t <xsl:value-of select="false()"/> 
 
\t </xsl:template> 
 
\t <xsl:template match="/"> 
 
\t \t <root> 
 
\t \t \t <xsl:variable name="call-template"> 
 
\t \t \t \t <xsl:call-template name="return-false"/> 
 
\t \t \t </xsl:variable> 
 
\t \t \t <xsl:if test="$call-template = true()"> 
 
\t \t \t \t <FALSE/> 
 
\t \t \t </xsl:if> 
 
\t \t </root> 
 
\t </xsl:template> 
 
</xsl:stylesheet>
猜猜我得到的输出文档 FALSE元素 。我想知道我应该哭还是应该笑我对这个简单例子的挣扎。我的挫折感触到了天空。

+0

如何提供XML输入和输出。 –

+0

我相信没有这些,就足够简单了。 –

回答

4

xsl:value-of指令创建一个文本节点。

<xsl:value-of select="false()"/> 

返回false()功能,这是字符串 “false” 的字串值。所以你的$call-template变量的内容是一个包含字符串“false”的文本节点。

http://www.w3.org/TR/xslt/#value-of

接下来,测试test="$call-template = true()"回报true(),因为:

  • 您比较文本节点为布尔值;
  • 与布尔值相比较的节点首先转换为布尔值;
  • 存在的节点在转换为布尔值时被评估为true()

http://www.w3.org/TR/xpath/#booleans

1

对值'true''false'进行测试,而不是功能,它的工作原理。你为什么这样做呢?你想达到什么目的?使用call-template来返回一个布尔值更像是一个过程性的事情,并且可能不适合XSLT的更多功能/声明模型。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template name="return-false"> 
     <xsl:value-of select="false()"/> 
    </xsl:template> 
    <xsl:template match="/"> 
     <root> 
      <xsl:variable name="call-template"> 
       <xsl:call-template name="return-false"/> 
      </xsl:variable> 
      <xsl:if test="$call-template = 'true'"> 
       <FALSE/> 
      </xsl:if> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 
+0

你是对的,但是不按我的方式工作的原因是什么? –

+0

查看@ michael.hor257k的回答 - 他明白了第一个 –

+0

模板返回布尔值时,没有任何内在的过程性或非声明性。只是它不能在XSLT 1.0中完成; 1.0中的模板总是返回节点(或者,使用1的语言。0规范,将结点写入结果树,在本例中,结果树是由xsl:variable创建的结果树片段)。 –

1

注意,在XSLT 2.0和3.0中的一个模板或函数可以返回一个布尔值,但不使用value-of,代替使用sequence例如

<xsl:template name="return-false"> 
    <xsl:sequence select="false()"/> 
</xsl:template> 

当然,通常你不会返回一个布尔常量值,而是简单地评估一个比较例如

<xsl:template name="check"> 
    <xsl:param name="input"/> 
    <xsl:sequence select="matches($input, 'foo')"/> 
</xsl:template> 

当然,使用这种代码在一个紧凑的形式,你会写一个函数

<xsl:function name="mf:check"> 
    <xsl:param name="input"/> 
    <xsl:sequence select="matches($input, 'foo')"/> 
</xsl:function> 

与例如叫它<xsl:variable name="check1" select="mf:check('foobar')"/>分别为<xsl:if test="mf:check('foobar')">..</xsl:if>

相关问题