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 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>
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).
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>
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>