Использование If Else в XSLT - PullRequest
4 голосов
/ 02 апреля 2012

Мне нужно выбрать узел, если условие соответствует.Я совершенно новый в XSLT и пытался найти ответ, но не могу найти решение, которое работает для меня.Я хочу выбрать адрес, когда есть AddressType = «Personal», если нет AddressType = «Personal», установите флажок «Second», если нет - «Office».Нормальный Если Остальное.Я попытался и и это могло бы работать, если бы только один тип AddressType существовал в файле XML.В моем случае в файле XML может быть до 11 addressTypes (в произвольном порядке), и я могу пропустить только один.

Это похоже на мой исходный 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>

Anyсовет?спасибо

Ответы [ 4 ]

6 голосов
/ 02 апреля 2012

Вам нужно использовать <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>
3 голосов
/ 02 апреля 2012

Другой вариант, вместо использования вложения всего в xsl: выберите , это использовать сопоставление с шаблоном, чтобы получить нужный случай.Попробуйте этот 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" не будет вызываться, если только один из другихшаблоны не совпадают. Для других шаблонов атрибут приоритета с более высоким приоритетом будет иметь приоритет, если все три шаблона совпадают. Таким образом, «Персональный» будет всегда выбираться, даже если присутствуют другие атрибуты.

(Если нетшаблонов имеет атрибут priority , в этом случае будет выбран последний соответствующий).

2 голосов
/ 02 апреля 2012

Вы можете использовать xsl: выбирать:

<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>
1 голос
/ 02 апреля 2012

Вот краткий и простой способ сделать это в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...