2013-10-02 3 views
6

Я хочу, чтобы переменная имела значение элемента, если значение является числовым, но если это не так, я хочу, чтобы переменная имела значение 0.Условная переменная select в XSLT

Другими словами, существует простой эквивалент следующего в XSLT?

var foobar = is_numeric(element value) ? element value : 0 

Или как бы вы это написали?

<xsl:variable name="foobar" select=" ? " /> 

ответ

7

В XPath 2.0 Да, вы можете использовать "castable as"

<xsl:variable name="foobar" as="xs:double" 
    select="if (x castable as xs:double) then x else 0" /> 
8

XPath 1.0:

<xsl:variable name="foobar"> 
    <xsl:choose> 
    <xsl:when test="number($value) = number($value)"> 
     <xsl:value-of select="$value"/> 
    </xsl:when> 
    <xsl:otherwise>0</xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Ссылка для этого умного number($value) = number($value) числового теста: Dimitre Novatchev's answer к "Xpath test if is number" question.

6

Вы могли бы использовать:

<xsl:variable name="x" 
       select="(ELEMENT[. castable as xs:double], 0)[1]"/> 

или

<xsl:variable name="x" 
       select="sum(ELEMENT[. castable as xs:double])"/> 
+0

Что '(х, у)' делать, в первом примере? – Svish

+1

@Svish, '(x, y)' формирует последовательность 'x' и' y', но как 'ELEMENT [. castable as xs: double] 'дает пустую последовательность, если содержимое' ELEMENT' не является двойным значением, это либо последовательность '(ELEMENT, 0)', либо просто последовательность '(0)'. И предикат '[1]' затем выбирает 'ELEMENT' или' 0'. –

+0

@Svish, в частности, если в текущем контексте есть более одного дочернего элемента ELEMENT, тогда мой подход всегда будет возвращать '0' (потому что последовательность из более чем одного элемента не является« castable as xs: double »), тогда как Подход Майкла вернет первый дочерний элемент «ELEMENT», который можно отнести к «xs: double» (в случае «(x, y) [1]») или сумме всех таких «ELEMENT's» (в 'sum() '), или' 0', если ни один из них не будет соответствующим образом закрыт. –

Смежные вопросы