Как реализовать условие "if else if else" в XSLT
Можно ли реализовать "if else, if else" в xsl? например, у меня есть данные:
<document>
<line>
<name>MAR111</name>
<value>1</value>
</line>
<line>
<name>MAR111</name>
<value>3</value>
</line>
<line>
<name>MEA111</name>
<value>1</value>
</line>
<line>
<name>MPR111</name>
<value>1</value>
</line>
<line>
<name>MEA111</name>
<value>4</value>
</line>
<line>
<name>MPR111</name>
<value>2</value>
</line>
</document>
Мне нужно получить три шаблона документов с тремя именами:
<document>
<MAR>
<name>MAR111</name>
<number>1</number>
<number>4</number>
</MAR>
</document>
<document>
<MEA>
<name>MEA111</name>
<number>1</number>
<number>4</number>
</MEA>
</document>
<document>
<MPR>
<name>MPR111</name>
<number>1</number>
<number>2</number>
</MPR>
</document>
Я пытаюсь использовать "выбрать, когда" применить шаблон, но, возможно, есть лучший способ:
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/document/line/name='MEA111'">
<xsl:apply-templates mode="MEA" select="/document"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="/document/line/name='MPR111'">
<xsl:apply-templates mode="MPR" select="/document"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="/document/line/name='MAR111'">
<xsl:apply-templates mode="MAR" select="/document"/>
</xsl:when>
</xsl:choose>
</xsl:template>
Ответы
Ответ 1
На самом деле вы можете объединить их вместе:
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/document/line/name='MEA111'">
<xsl:apply-templates mode="MEA" select="/document"/>
</xsl:when>
<xsl:when test="/document/line/name='MPR111'">
<xsl:apply-templates mode="MPR" select="/document"/>
</xsl:when>
<xsl:when test="/document/line/name='MAR111'">
<xsl:apply-templates mode="MAR" select="/document"/>
</xsl:when>
</xsl:choose>
</xsl:template>
EDIT: Петрас, после вашего разъяснения, кажется, что вам еще проще:
<xsl:template match="/">
<xsl:if test="/document/line/name='MEA111'">
<xsl:apply-templates mode="MEA" select="/document"/>
</xsl:if>
<xsl:if test="/document/line/name='MPR111'">
<xsl:apply-templates mode="MPR" select="/document"/>
</xsl:if>
<xsl:if test="/document/line/name='MAR111'">
<xsl:apply-templates mode="MAR" select="/document"/>
</xsl:if>
</xsl:template>
Ответ 2
Лучший способ - использовать отдельные шаблоны.
<xsl:template match="/document/line/name='MEA111'">
<xsl:apply-templates mode="MEA" select="/document"/>
</xsl:template>
<xsl:template match="/document/line/name='MPR111'">
<xsl:apply-templates mode="MPR" select="/document"/>
</xsl:template>
<xsl:template match="/document/line/name='MAR111'">
<xsl:apply-templates mode="MAR" select="/document"/>
</xsl:template>
Еще меньше строк, и это более удобно.
Ответ 3
Нет, choose when
- это xsl способ сказать if else
. Нет лучшего способа
Ответ 4
Эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kLineByName" match="line" use="name"/>
<xsl:template match="line[count(.|key('kLineByName',name)[1]) = 1]">
<document>
<xsl:element name="{substring(name,1,3)}">
<xsl:copy-of select="name|key('kLineByName',name)/value"/>
</xsl:element>
</document>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Вывод:
<document>
<MAR>
<name>MAR111</name>
<value>1</value>
<value>3</value>
</MAR>
</document>
<document>
<MEA>
<name>MEA111</name>
<value>1</value>
<value>4</value>
</MEA>
</document>
<document>
<MPR>
<name>MPR111</name>
<value>1</value>
<value>2</value>
</MPR>
</document>
Ответ 5
если вы хотите реализовать провал "все-таки" (например, эквивалент "else" ), вы должны использовать otherwise
Ответ 6
Вы имеете в виду что-то вроде:
<xsl:choose>
<xsl:when test="name() = 'MAR111'">
... do something ...
</xsl:when>
<xsl:otherwise>
... do something as fallback ...
</xsl:otherwise>
</xsl:choose>
BR Маркус
Ответ 7
Да, мы можем достичь вещей, используя <xsl:choose><xsl:when>
, но если, если if, условие также поддерживается в атрибуте @select для другой конструкции xslt, например:
<xsl:value-of select="if (@geography = 'North America') then
'Domestic car'
else if (@geography = 'Europe') then
'Import from Europe'
else if (@geography = 'Asia') then
"It from Asia"
(: If it anything else :)
else
'We don''t know!'"/>