如何检查字符串变量的值是“是”还是“否”?

时间:2009-10-31 07:41:03

标签: xml xslt

如何检查字符串变量的值是“是”还是“否”?

<xsl:variable name="test1" select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test1']/DBE:String"/>
<xsl:variable name="test2" select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test2']/DBE:String"/>

<xsl:choose>
<xsl:when test="$test1 = 'Yes'>
    <xsl:apply-templates select="YES"/>
</xsl:when>
<xsl:when test="$test2 = 'Yes'>
    <xsl:apply-templates select="Invalid"/>
</xsl:when>
<xsl:otherwise>
     <xsl:apply-templates select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test3']/DBE:String"/>
</xsl:otherwise>
</xsl:choose>

请告诉我上面的错误。

2 个答案:

答案 0 :(得分:3)

您的问题不是when测试,而是<xsl:apply-templates select="YES"/><xsl:apply-templates select="Invalid"/>YESInvalid不对应任何东西 - 在XSL中没有常量的概念,它看起来不像XPath表达式 - 因此没有什么可以应用于。

相反,尝试这样的事情:

<xsl:variable 
  name="test1" 
  select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test1']/DBE:String"
  />
<xsl:variable 
  name="test2" 
  select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test2']/DBE:String"
  />

<xsl:choose>
  <xsl:when test="lower-case($test1) = 'yes'>
    <xsl:apply-templates 
      select="."
      mode="test-yes"
      />
  </xsl:when>
  <xsl:when test="lower-case($test2) = 'yes'>
    <xsl:apply-templates 
      select="."
      mode="test-invalid"
      />
  </xsl:when>
  <xsl:otherwise>
     <xsl:apply-templates 
      select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test3']/DBE:String"
      />
  </xsl:otherwise>
</xsl:choose>

<xsl:template match="*" mode="test-yes">
  Yes!!!
</xsl:template>

<xsl:template match="*" mode="test-invalid">
  Invalid!!!
</xsl:template>

另外,请记住,变量在XSL中可能“昂贵”;处理引擎获取您正在引用的节点集的完整副本,而不仅仅是保留指针,因此在处理该部分上下文时,您将携带内存中节点集的“权重”。如果你可以进行内联测试,那就更好了。

事实上,与优化的choose流量相比,apply-templates相对较慢。您的处理速度会快得多。如果您确定只有一个测试匹配,那么最好做这样的事情:

<xsl:apply-templates 
  mode="test-yes"
  select="
    DBE:OBJECT/DBE:ATTRIBUTE[@name='test1']/DBE:String[lower-case(.) = 'yes']
  " />

<xsl:apply-templates 
  mode="test-invalid"
  select="
    DBE:OBJECT/DBE:ATTRIBUTE[@name='test2']/DBE:String[lower-case(.) = 'yes']
  " />

  <xsl:apply-templates 
  mode="test-otherwise"
  select="
    DBE:OBJECT/DBE:ATTRIBUTE[@name='test2']/DBE:String
  " />

<xsl:template match="*" mode="test-yes">
  Yes!!!
</xsl:template>

<xsl:template match="*" mode="test-invalid">
  Invalid!!!
</xsl:template>

<xsl:template match="*" mode="test-otherwise">
  Something else!
</xsl:template>

如果您无法确定是否可以将“内联”的其他测试添加到apply-templates,例如:

<xsl:apply-templates 
  mode="test-yes"
  select="
    DBE:OBJECT/DBE:ATTRIBUTE[
      @name='test1'
    ]/DBE:String[
      lower-case(.) = 'yes'
      and
      not(
        lower-case(../DBE:ATTRIBUTE[@name='test2']/DBE:String/text()) = 'yes'
      )
    ]
  " />
<!-- etc... -->

答案 1 :(得分:1)

元素:

<xsl:apply-templates select="YES"/>

将尝试查找当前上下文的子元素,其限定名称为YES,即它正在寻找类似的内容:

<YES ...>...</YES>

这几乎肯定不是你想要的。这是一个容易犯的错误,而且我经常犯这个错误。