我有一个带有 type -node的XML文档,其值为“1”或“2”:
<MyDoc>
<foo>
<bar>
<type>2</type>
</bar>
</foo>
</MyDoc>
我想根据类型节点的值设置变量 typeBool ,如果是“1”,则应将其设置为 false ,如果它是“ 2“到 true 。
使用XSLT-choose-Element,应该可以测试当前值并根据结果设置 typeBool 。
我正在尝试使用XSLT 2.0中的以下构造执行此操作,但我很困惑,“否则” -path未应用,我收到错误 typeBool 未创建:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:variable name="type" select="/MyDoc/foo/bar/type/text()"/>
<xsl:choose>
<xsl:when test="$type = '2'">
<xsl:variable name="typeBool">true</xsl:variable>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="typeBool">false</xsl:variable>
</xsl:otherwise>
</xsl:choose>
<h1><b><xsl:value-of select="$typeBool"/></b></h1>
</xsl:transform>
这是我得到的转换错误:
error during xslt transformation:
Source location: line 0, col 0 Description:
No variable with name typeBool exists
答案 0 :(得分:1)
choose-clause必须在变量声明
的里面定义<xsl:variable name="type">
<xsl:value-of select="/MyDoc/foo/bar/type/text()"/>
</xsl:variable>
<xsl:variable name="typeBool">
<xsl:choose>
<xsl:when test="$type = '2'">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
条件也看起来更干净。
@MichaelKay指出在XSLT 2.0中可以使用xpath-conditional,这更简单:
<xsl:variable name="type">
<xsl:value-of select="/MyDoc/foo/bar/type/text()"/>
</xsl:variable>
<h1>
<b>
<xsl:value-of select="select="if($type=2) then 'true' else 'false'"/>
</b>
</h1>
答案 1 :(得分:1)
当您提出问题时,不需要xsl:choose
,这会使您的XSLT代码不必要地复杂化。你的实际问题可能更复杂。
您可以编写与您感兴趣的元素匹配的模板(例如,type
元素),然后只需选择将评估为true或false的比较值。
XSLT样式表
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="type">
<h1>
<b>
<xsl:value-of select=". = '2'"/>
</b>
</h1>
</xsl:template>
<xsl:template match="text()"/>
</xsl:transform>
HTML输出
<h1><b>true</b></h1>
在线试用here。