2010-06-30 17 views
3

Если я тестирую несколько разных определенных параметров, могу ли я вызвать несколько операторов xsl:when на основании заявления xsl:choose? Так что, если у меня есть:Несколько xsl: выберите в пределах одного xsl: когда

<parameters> 
        <param id="1"> 
         <key>Load</key> 
         <value>XML</value> 
        </param> 
        <param id="2"> 
         <key>Input</key> 
         <value>Http</value> 
        </param> 
        <param id="3"> 
         <key>Response</key> 
         <value>Y</value> 
        </param> 
</parameters> 

я мог назвать три различных <xsl:when> с одним <xsl:choose>, чтобы проверить, потому что у меня будет несколько <param> с различными <value>, которые позже должны помочь назвать различные шаблоны.

+0

Хороший вопрос (+1). См. Мой ответ для другого подхода. –

ответ

5

Да, конечно, вы можете. Вы можете также добавить xsl:otherwise узел для обработки всех других случаев:

<xsl:choose> 
    <xsl:when test="param/@id = '1'"> 
     <xsl:text>XML</xsl:text> 
    </xsl:when> 
    <xsl:when test="param/@id = '2'"> 
     <xsl:text>HTTP</xsl:text> 
    </xsl:when> 
    <xsl:when test="param/@id = '3'"> 
     <xsl:text>Y</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>Other format</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 

Это похоже на switch заявление в C-подобных языках и Java, или Select Case в VB.

Конечно, вы можете проверить произвольные выражения XPath, например. вы могли бы проверить, а для

<xsl:when test="param/key = 'Input'"> 
    <!-- handle input --> 
</xsl:when> 
+2

Является ли каждый взаимоисключающим? Итак, если бы все три теста были истинными, был бы выбран только первый? – austinmarton

3

я мог назвать три различных с одним , чтобы проверить, потому что у меня будет несколько с различными , которые позже должны помочь позвонить различные шаблоны.

Да, вы можете и @ 0xA3 показать вам, как это сделать.

Но вам не нужно и не должно!

Именно в XSLT процессор XSLT может решить, какой шаблон применить к какому условию.

Это преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="param[@id=1]"> 
    Load! 
</xsl:template> 

<xsl:template match="param[@id=2]"> 
    Input! 
</xsl:template> 

<xsl:template match="param[@id=3]"> 
    Response! 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на прилагаемом XML документа:

<parameters> 
    <param id="1"> 
     <key>Load</key> 
     <value>XML</value> 
    </param> 
    <param id="2"> 
     <key>Input</key> 
     <value>Http</value> 
    </param> 
    <param id="3"> 
     <key>Response</key> 
     <value>Y</value> 
    </param> 
</parameters> 

производит:

<parameters> 
    Load! 

    Input! 

    Response! 
</parameters> 

Обратите внимание, что мы не использовали условную логику - сам процессор XSLT решил, какой шаблон применять для элементов <param> с различными атрибутами id.

Это большой объект (в данном конкретном случае вы сохранили 14 строк кода, который подвержен ошибкам) ​​и рекомендуется использовать как можно чаще

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