2009-04-13 63 views
15

我试图根据节点是否存在设置输出变量的文字字符串值。我认为条件检查逻辑是正确的。但它不是outputing值...<xsl:variable>使用<xsl:value-of>打印出XSL变量的值

<xsl:variable name="subexists"/> 

<xsl:template match="class"> 
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
<xsl:choose> 
    <xsl:when test="joined-subclass"> 
     <xsl:variable name="subexists" select="'true'"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:variable name="subexists" select="'false'"/> 
    </xsl:otherwise> 
</xsl:choose> 
subexists: <xsl:value-of select="$subexists" /> 

我希望它输出的文本字符串是“true”的“假”。但它不会输出任何内容。请帮忙!谢谢!!!

回答

17

在这种情况下不需要条件语句来设置变量

这一个班轮XPath表达式:

boolean(joined-subclass) 

true()仅在当前节点的孩子,取名为joined-subclass存在,它是false()否则。

完整的样式表

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 

<xsl:template match="class"> 
    <xsl:variable name="subexists" 
     select="boolean(joined-subclass)" 
    /> 

    subexists: <xsl:text/> 
    <xsl:value-of select="$subexists" /> 
</xsl:template> 
</xsl:stylesheet> 

请注意,在这个表达式使用XPath函数boolean()的是一个节点(或者其由于缺少)转换成的一个布尔值true()false()

7

你的主要问题是认为你在模板之外声明的变量是在choose语句中被“设置”的相同变量。这不是XSLT的工作方式,变量不能被重新分配。这东西更像你想要什么:

<xsl:template match="class"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
    <xsl:variable name="subexists"> 
    <xsl:choose> 
     <xsl:when test="joined-subclass">true</xsl:when> 
     <xsl:otherwise>false</xsl:otherwise> 
    </xsl:choose> 
    </xsl:variable> 
    subexists:  <xsl:value-of select="$subexists" /> 
</xsl:template> 

如果你需要的变量有“全局”范围则声明它的模板之外:

<xsl:variable name="subexists"> 
    <xsl:choose> 
    <xsl:when test="/path/to/node/joined-subclass">true</xsl:when> 
    <xsl:otherwise>false</xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

<xsl:template match="class"> 
    subexists:  <xsl:value-of select="$subexists" /> 
</xsl:template> 
6

在XSLT相同<xsl:variable>能只能声明一次,只有在声明时才能赋予其值。如果同时声明多个变量,它们实际上是不同的变量并且具有不同的范围。

因此,实现可变的通缉条件设置的方式,并产生其值如下:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 

    <xsl:template match="class"> 
    <xsl:variable name="subexists"> 
      <xsl:choose> 
       <xsl:when test="joined-subclass">true</xsl:when> 
       <xsl:otherwise>false</xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     subexists: <xsl:text/>  
     <xsl:value-of select="$subexists" /> 
    </xsl:template> 
</xsl:stylesheet> 

当在下面的XML文档应用上述变换:

<class> 
<joined-subclass/> 
</class> 

想要的结果产生

subexists: true