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()
.
您的主要问题是您在模板外声明的变量是在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)
在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)
归档时间: |
|
查看次数: |
138861 次 |
最近记录: |