Как проверить, является ли значение строковой переменной Да или Нет? - PullRequest
0 голосов
/ 31 октября 2009

Как я могу проверить, является ли значение строковой переменной Да или Нет?

<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 ]

3 голосов
/ 31 октября 2009

Ваша проблема не в тесте when, а в <xsl:apply-templates select="YES"/> и <xsl:apply-templates select="Invalid"/>. YES и Invalid ни к чему не будут соответствовать - в 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>

Если вы не уверены, что всегда можете добавить дополнительные тесты «inline» к 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 голос
/ 31 октября 2009

Элемент:

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

будет пытаться найти дочерние элементы текущего контекста, чье квалифицированное имя - YES, то есть он ищет что-то вроде:

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

Это почти наверняка не то, что вы хотите. Это легкая ошибка, и я делал это часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...