xsl: if-выражение не работает

#xslt #xpath #conditional-statements #xslt-2.0

#xslt #xpath #условные операторы #xslt-2.0

Вопрос:

Я получил следующую структуру:

 <root>
    <elements>
        <element>
            <key>1</key>
            <key2>10</key2>
        </element>
        <element>
            <key>2</key>
            <key2>100</key2>
        </element>  
    </elements>
</root>
  

Я хочу создать блок

 <newelement></newelement>
  

когда, например, значение key равно 2 , а значение key2 не равно ''

Для выбора элемента этот XPath работает отлично:

 /root/elements/element/key[text() = '2']/../key2[text() != '']
  

но когда я помещаю это в xsl:if преобразование, оно не создаст желаемого newelement

 <xsl:if test="/root/elements/element/key[text() = '2']/../key2 != ''">
    <newelement></newelement>
</xsl:if>
  

Чего мне не хватает?

Комментарии:

1. Это должно сработать. Смотрите: xsltransform.net/bFDb2BL

2. Хотя ваше выражение XPath будет работать, оно неуклюжее. Его можно переписать /root/elements/element[key='2' and key2='']/key

3. @helderdarocha: Спасибо 4, что игровая площадка

Ответ №1:

 <root>
<elements>
     <element>
        <key>2</key>
        <key2>100</key2>
    </element>  
    <element>
        <key>2</key>
        <key2></key2>
    </element> 
</elements>
</root>
  

Код XSLT:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="elements">
    <root>
        <xsl:apply-templates/>
    </root>
</xsl:template>
<xsl:template match="element">
    <xsl:variable name="valueKey2" select="key2"/>
    <xsl:variable name="nameKey2" select="key2/name()"/>
    <xsl:if test="key[text() = '2'] and $valueKey2 != ''">
        <newelement>
            <!--use key2 as attribute of <newelement>-->
            <xsl:attribute name="{$nameKey2}"><xsl:value-of select="$valueKey2"/></xsl:attribute>
            <!--use key2 inside <newelemnt>-->
            <xsl:value-of select="$valueKey2"/>
        </newelement>
    </xsl:if>
</xsl:template>
</xsl:stylesheet>
  

Комментарии:

1. Что делать, если я хочу выбрать значение key2 внутри newelement? Есть ли способ упростить это вместо повторного использования всего XPath-выражения?