我正在尝试输出变量的文字字符串值,然后根据节点是否存在来设置它。我认为条件检查逻辑是正确的。但它没有输出值......
<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" />
我希望它输出“false”的“true”的文字字符串。但它没有输出任何东西。请帮忙!谢谢!!!
答案 0 :(得分:20)
在这种情况下,无需条件来设置变量。
这个单行的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()
是将节点(或其absense)转换为布尔值之一值 true()
或 false()
。
答案 1 :(得分: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>
答案 2 :(得分: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