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

tom*_*ato 17 xslt xsl-variable

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

<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" />
Run Code Online (Sandbox Code Playgroud)

我希望它输出"true"的"true"的文字字符串.但它没有输出任何东西.请帮忙!谢谢!!!

Dim*_*hev 21

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

这个单线XPath表达式:

boolean(joined-subclass)
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

请注意,boolean()在此表达式中使用XPath函数是将节点(或其absense)转换为其中一个布尔值true()false().


edd*_*ves 7

您的主要问题是您在模板外声明的变量是在select语句中"设置"的相同变量.这不是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>
Run Code Online (Sandbox Code Playgroud)

如果您需要变量具有"全局"范围,则将其声明在模板之外:

<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>
Run Code Online (Sandbox Code Playgroud)


Dim*_*hev 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>
Run Code Online (Sandbox Code Playgroud)

将以上转换应用于以下XML文档时:

<class>
 <joined-subclass/>
</class>
Run Code Online (Sandbox Code Playgroud)

产生了想要的结果:

    subexists:  true
Run Code Online (Sandbox Code Playgroud)