在XSLT中使用If Else

时间:2012-04-02 06:48:21

标签: xml xslt

如果条件匹配,我需要选择一个节点。我是XSLT的新手,并试图寻找答案,但找不到适合我的解决方案。 我想在AddressType ='Personal'时选择一个adres,如果没有AddressType = Personal,检查'Second',如果没有检查'Office'。 一个正常的If Else。 我试过和,如果XML文件中只存在一种类型的AddressType,这可能会起作用。在我的情况下,XML文件中可能有11个地址类型(按随机顺序),我只能传递一个。

这看起来像我的源XML:

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

有什么建议吗?谢谢

4 个答案:

答案 0 :(得分:6)

您需要使用<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>

答案 1 :(得分:3)

另一种选择,而不是在 xsl:choose 中嵌套所有内容,是使用模板匹配来获得所需的案例。试试这个XSLT作为例子

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

请注意,具有更多特定模式的模板优先于没有模式的模板(这就是为什么不会调用最后一个“Person”模板,除非任何其他模板不匹配。对于其他模板,如果所有三个模板都匹配,优先级属性将优先级更高。因此即使存在其他属性,也将始终选择“个人”。

(如果所有模板都没有优先级属性,则在这种情况下将选择最后一个匹配的模板。)

答案 2 :(得分:2)

您可以使用xsl:choose:

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

答案 3 :(得分:1)

以下是在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>

将此转换应用于以下XML文档(最初提供的地址随机重新调整地址):

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

选择并处理了需要的正确address元素(在这种情况下只是输出):

<address>
   <street/>
   <number/>
   <City/>
   <AddressType>Personal</AddressType>
</address>