<xsl:variable> 使用 <xsl:value-of> 输出 XSL 变量的值

20
我尝试输出一个变量的字面字符串值,这个值在取决于节点是否存在后被设置。我认为条件检查逻辑是正确的。但它没有输出值...
<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" 或 "false" 。但它没有输出任何东西。请帮忙!谢谢!!!

3个回答

23
在这种情况下,不需要条件语句来设置变量。
这个一行的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

你的主要问题在于认为在模板之外声明的变量与“选择”语句内部“设置”的变量是相同的变量。这不是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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接