否则,XSLT-choose中的语句未应用/正在工作

时间:2017-01-31 10:16:23

标签: xslt conditional

我有一个带有 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

2 个答案:

答案 0 :(得分:1)

使用choose-element

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>

条件也看起来更干净。

使用XSLT 2.0

@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