Usar o If Else no XSLT

Preciso de seleccionar um nó se uma condição for igualada. Sou totalmente novo no XSLT e tentei procurar uma resposta, mas não consigo encontrar uma solução que funcione para mim. Eu quero selecionar um adres quando houver um AddressType = 'pessoal', se não houver um AddressType = pessoal, Verifique para 'Second', se não verificar para 'Office'. Um normal, se não. Eu tentei com e e isso poderia funcionar se apenas um tipo de AddressType existiria no arquivo XML. No meu caso, pode haver 11 tipos adicionais (em ordem aleatória) no arquivo XML e eu só posso passar um através.

isto parece-se com o meu XML de origem:

<Person>
<address>
<street></street
<number></number>
<City></City>
<AddressType>Personal</AddressType>
</address>
<address>
<street></street
<number></number>
<City></City>
<AddressType>Second</AddressType>
</address>
<address>
<street></street
<number></number>
<City></City>
<AddressType>Office</AddressType>
</address>
</Person>
Algum conselho? obrigado.
 4
Author: user1292411, 2012-04-02

4 answers

<xsl:choose>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:choose>
            <xsl:when test="/Person/address/AddressType='Personal'">
                <!-- DO Stuff -->
            </xsl:when>
            <xsl:when test="/Person/address/AddressType='Second'">
                <!-- DO Stuff -->
            </xsl:when>
            <xsl:when test="/Person/address/AddressType='Office'">
                <!-- DO Stuff -->
            </xsl:when>
            <xsl:otherwise>
                <!-- Do your else stuff -->
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
 6
Author: Dan675, 2012-04-02 07:00:15

Outra opção, em vez de usar aninhar tudo num xsl:escolha, é usar o modelo correspondente para obter a pasta que deseja. Tente este XSLT como um exemplo

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="Person[address/AddressType='Personal']" priority="3">
      Match Personal
   </xsl:template>

   <xsl:template match="Person[address/AddressType='Second']" priority="2">
      Match Second
   </xsl:template>

   <xsl:template match="Person[address/AddressType='Office']" priority="1">
      Match Office
   </xsl:template>

   <xsl:template match="Person">
      Match None
   </xsl:template>
</xsl:stylesheet>

Lembre-se que os modelos com padrões mais específicos têm precedência sobre aqueles sem padrão (razão pela qual o último modelo "pessoa" não será chamado a menos que nenhum dos outros modelos não corresponda. Para os outros modelos, quanto maior o atributo prioridade terá precedência se todos os três modelos corresponder. Assim, "Pessoal" será sempre escolhido mesmo quando os outros atributos estão presentes.

(Se nenhum dos modelos tivesse um atributode prioridade , o último correspondente seria escolhido neste caso).

 3
Author: Tim C, 2012-04-02 08:15:22

Pode usar o xsl: escolha:

<xsl:choose>
    <xsl:when test"some condition">
        Statement...
    </xsl:when>
    <xsl:when test="some other condition">
        Statement...
    </xsl:when>
    <xsl:otherwise>
        Default...
    </xsl:otherwise>
</xsl:choose>
 2
Author: Torbjörn Kalin, 2012-04-02 06:55:37

Aqui está uma maneira curta e simples de fazer isso no XSLT 1.0:

<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:param name="pAddressTypes" select="'PersonalSecondOffice'"/>
 <xsl:template match="/*">
     <xsl:apply-templates select="address">
       <xsl:sort select=
         "string-length(substring-before($pAddressTypes, AddressType))"/>
     </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="address">
  <xsl:if test="position() = 1">
    <xsl:copy-of select="."/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

Quando esta transformação é aplicada no seguinte documento XML (o originalmente fornecido com endereços remodelados aleatoriamente):

<Person>
    <address>
        <street></street>
        <number></number>
        <City></City>
        <AddressType>Office</AddressType>
    </address>
    <address>
        <street></street>
        <number></number>
        <City></City>
        <AddressType>Personal</AddressType>
    </address>
    <address>
        <street></street>
        <number></number>
        <City></City>
        <AddressType>Second</AddressType>
    </address>
</Person>

O elemento desejado, correcto address é seleccionado e processado (Neste caso apenas o resultado):

<address>
   <street/>
   <number/>
   <City/>
   <AddressType>Personal</AddressType>
</address>
 1
Author: Dimitre Novatchev, 2012-04-02 12:58:08