XSLT:如何在xslt中模仿一个标志或break语句:foreach whiling迭代一个变量List

时间:2017-11-11 15:27:15

标签: xslt

我是xslt的新手,请原谅我的任何错误 在xsl程序中,我得到了一个值列表,其变量名为" foo:vars",其中包含颜色值列表。
有一个声明为 matchWith 的变量,它可以包含任何值(不一定存在于foor:var list中)

程序应输出为:

  1. 如果变量 matchWith 包含列表&#34; foo:vars&#34; 中的值,则该值应显示在代码中 <color_found>具有匹配值。
  2. 否则,变量matchWith中的值应出现在另一个名为<color_not_found>
  3. 的标记中

    下面是程序,能够为案例1提供正确的输出,但是我在条件2的条件下失败了。

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:foo="http://foo.com" exclude-result-prefixes="foo">
      <xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/>
      <foo:vars>
        <foo:var name="a1">Yellow</foo:var>
        <foo:var name="b1">red</foo:var>
        <foo:var name="c1">green</foo:var>
        <foo:var name="d1">blue</foo:var>
      </foo:vars>
      <xsl:variable name="matchWith">Yellow</xsl:variable>
      <xsl:template match="/">
        <xsl:for-each select="document('')/xsl:stylesheet/foo:vars/foo:var">
          <xsl:variable name="temp">
            <xsl:value-of select="."/>
          </xsl:variable>
          <xsl:choose>
            <xsl:when test="$temp=$matchWith">
              <color_found>
                <xsl:value-of select="$matchWith"/>
              </color_found>
            </xsl:when>
          </xsl:choose>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    

1 个答案:

答案 0 :(得分:1)

问题是当您应该直接检查是否存在匹配值时,您正在使用for-each

像这样:

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:foo="http://foo.com" exclude-result-prefixes="foo">
  <xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/>
  <foo:vars>
    <foo:var name="a1">Yellow</foo:var>
    <foo:var name="b1">red</foo:var>
    <foo:var name="c1">green</foo:var>
    <foo:var name="d1">blue</foo:var>
  </foo:vars>
  <xsl:variable name="matchWith">Yellow</xsl:variable>
  <xsl:template match="/">
    <xsl:variable name="options"
                  select="document('')/xsl:stylesheet/foo:vars/foo:var" />
    <xsl:variable name="isMatch" select="$matchWith = $options" />

    <xsl:element name="color_{ substring('not_', 1, 4 * not($isMatch)) }found">
      <xsl:value-of select="$matchWith" />
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>