Ваша проблема не в тесте 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... -->