#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-выражения?