19

在根据节点是否存在设置变量之后,我正在尝试输出变量的文字字符串值。我认为条件检查逻辑是正确的。但它没有输出值......

<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" />

我希望它输出“假”或“真”的文字字符串。但它没有输出任何东西。请帮忙!谢谢!!!

4

3 回答 3

22

在这种情况下,设置变量不需要条件

这个单行 XPath 表达式:

boolean(joined-subclass)

true()当当前节点的子节点,namedjoined-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().

于 2009-04-13T13:24:31.997 回答
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>
于 2009-04-13T01:57:49.387 回答
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
于 2009-04-13T02:08:16.227 回答