Несколько xsl: выбрать в одном xsl: когда - PullRequest
3 голосов
/ 30 июня 2010

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

<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>, которые позже понадобятся для вызова разных шаблонов.

Ответы [ 2 ]

5 голосов
/ 30 июня 2010

Да, конечно, вы можете.Вы также можете добавить узел 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>
3 голосов
/ 10 июля 2010

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

Да, вы можете и @ 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 строк кода, подверженного ошибкам), и его рекомендуется использовать как можно чаще

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...