XSLT中的条件语句,当必须从多个元素中选择一个标记时 [英] Conditional Statements in XSLT when having to choose a tag from several elements

查看:60
本文介绍了XSLT中的条件语句,当必须从多个元素中选择一个标记时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对XSLT相对陌生,但是正在尝试学习它来为客户提供解决方案.尽管最终目的是为Filemaker Pro编写XSLT,但我还是想先正确地编写HTML.

我收到一个生成的XML文件,其中包含旅行的预订信息.其中包含的信息以及订单数量也有所不同.

需要XSLT以更合适的表格形式显示所有XML信息.

当我输入条件语句时,我的问题就开始了.在示例中,如果BSServType ='TUTU'的值,则该表应反映一些信息,否则,表应查找值'SOHO',如果不是'SOVI'.

此特定标记本身是DetSeg的子代.有几个DetSeg标签.不幸的是,该信息可能在任何1个标记中,因此XSLT应该能够查看正确的标记,然后选择其中一个值.我无法这样做.

第二个问题是以下语句:当值为'TUTU'时,选择'BSServDest'似乎可以正常工作,因为它是'BSServType'的同级项,但'BSServQuota'不是同级项,而是'侄子,如果我能这么说的话.这也带来了一个问题,因为我无法选择它们

我希望我的解释足够清楚. XML和XSLT已粘贴.我曾尝试在该站点附近寻找问题是否已经出现,但没有发现任何可以完全帮助我的问题.我希望可以解决此问题,因为还有更多条件语句需要遵循相同的逻辑编写.

我还有另一个疑问:以后为Filemaker Pro改写的XSLT是否可以适应?

提前感谢大家.

XML代码:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="order.xsl" type="text/xsl" ?>
<AllBookingFnp>
<BookingFnp>
<BookSegServ>
<BookSeg>
<DetSeg>
<BSDataIni>2011-06-25</BSDataIni>
<BSDataFin>2011-07-02</BSDataFin>
<BSCodTGeogr>LOC</BSCodTGeogr>
<BSCodCGeogr>ATH</BSCodCGeogr>
<BSDesGeogr><![CDATA[ATENE]]></BSDesGeogr>
<BSServType>TUTU</BSServType>
<BSServCod>GREMETEORE</BSServCod>
<BSServDes><![CDATA[TOUR GRECIA CLASSICA E METEORE]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>GRECIT</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>1</BSservQtall>
<BSServQuota>DBLCDM</BSServQuota>
<BSServCodSist>DBL</BSServCodSist>
<BSServCodTrat>CDM</BSServCodTrat>
<BSServSist><![CDATA[DOPPIA]]></BSServSist>
<BSservTrat><![CDATA[COME DA PROGRAMMA]]></BSservTrat>
</BSSservSpec>
<BSFornText>SERVIZIO FORNITO DA:</BSFornText>
<BSFornDescr><![CDATA[PANHELLAS]]></BSFornDescr>
<BSFornInd><![CDATA[EL.VENIZELOU 161 N.ERYTHREA 14671]]></BSFornInd>
<BSFornLoc><![CDATA[ATHENS]]></BSFornLoc>
<BSFornTel>0030 210 8003073</BSFornTel>
<BSFornFax>Fax 8003030</BSFornFax>
</BookSeg>
<BookSeg>
<DetSeg>
<BSDataIni>2011-07-02</BSDataIni>
<BSDataFin>2011-07-09</BSDataFin>
<BSCodTGeogr>LOC</BSCodTGeogr>
<BSCodCGeogr>HYDV</BSCodCGeogr>
<BSDesGeogr><![CDATA[HYDRA - GRECIA]]></BSDesGeogr>
<BSServType>SOVI</BSServType>
<BSServCod>GREHYDRABEAC</BSServCod>
<BSServDes><![CDATA[HYDRA BEACH - VILLAGGIO VALTUR]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>GRECIA</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>1</BSservQtall>
<BSServQuota>DBOCLAFV</BSServQuota>
<BSServCodSist>DBOCLA</BSServCodSist>
<BSServCodTrat>FV</BSServCodTrat>
<BSServSist><![CDATA[DOPPIA+letto uso doppia CLASSIC]]></BSServSist>
<BSservTrat><![CDATA[]]></BSservTrat>
</BSSservSpec>
<BSAnagRis>
<BSAnagDesRis><![CDATA[]]></BSAnagDesRis>
<BSAnagIndRis><![CDATA[A.E. PLEPI-THERMISIA]]></BSAnagIndRis>
<BSAnagLocRis><![CDATA[ERMIONI]]></BSAnagLocRis>
<BSAnagTelRis></BSAnagTelRis>
<BSAnagFaxRis></BSAnagFaxRis>
</BSAnagRis>
<BSServNoteDet><![CDATA[NOTA BENE: ALL'ARRIVO GLI OSPITI CHE NON UTILIZZANO I TRASPORTI VALTUR]]></BSServNoteDet>
<BSServNoteDet><![CDATA[SONO ATTESI DOPO LE ORE 16:00. IL GIORNO DELLA VOSTRA PARTENZA VI]]></BSServNoteDet>
<BSServNoteDet><![CDATA[INVITIAMO A LIBERARE LE STANZE PRIMA DELLE ORE 10:00.]]></BSServNoteDet>
<BSServNoteDet><![CDATA[**********************************************************************]]></BSServNoteDet>
<BSFornInd><![CDATA[]]></BSFornInd>
<BSFornLoc><![CDATA[]]></BSFornLoc>
<BSFornTel></BSFornTel>
<BSFornFax></BSFornFax>
</BookSeg>
</BookSegServ>
</BookingFnp>
<BookingFnp>
<BookSegServ>
<BookSeg>
<DetSeg>
<BSDataIni>2011-06-25</BSDataIni>
<BSDataFin>2011-06-25</BSDataFin>
<BSServType>TFTI</BSServType>
<BSServCod>NYCAPTHTL-I</BSServCod>
<BSServDes><![CDATA[TRANSFER APT NEW YORK-HOTEL]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>USA</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>2</BSservQtall>
<BSServQuota></BSServQuota>
<BSServCodSist></BSServCodSist>
<BSServCodTrat></BSServCodTrat>
<BSServSist><![CDATA[]]></BSServSist>
<BSservTrat><![CDATA[]]></BSservTrat>
</BSSservSpec>
<BSServFrom><![CDATA[AZ   642 FCO-EWR 25/06/11 13:45]]></BSServFrom>
<BSServTo><![CDATA[RADISSON LEXINGTON HOTEL]]></BSServTo>
<BSFornText>SERVIZIO FORNITO DA:</BSFornText>
<BSFornDescr><![CDATA[TEAM AMERICA INC]]></BSFornDescr>
<BSFornInd><![CDATA[125 PARK AVENUE, 2ND FLOOR]]></BSFornInd>
<BSFornLoc><![CDATA[NEW YORK]]></BSFornLoc>
<BSFornTel>001 212 6977165</BSFornTel>
<BSFornFax>Fax 7182471706</BSFornFax>
</BookSeg>
<BookSeg>
<DetSeg>
<BSDataIni>2011-06-25</BSDataIni>
<BSDataFin>2011-07-02</BSDataFin>
<BSServType>SOHO</BSServType>
<BSServCod>NYCLEXINGTON</BSServCod>
<BSServDes><![CDATA[RADISSON LEXINGTON HOTEL]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>USA</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>1</BSservQtall>
<BSServQuota>DBL</BSServQuota>
<BSServCodSist>DBL</BSServCodSist>
<BSServCodTrat></BSServCodTrat>
<BSServSist><![CDATA[DOPPIA]]></BSServSist>
<BSservTrat><![CDATA[]]></BSservTrat>
</BSSservSpec>
<BSAnagRis>
<BSAnagDesRis><![CDATA[]]></BSAnagDesRis>
<BSAnagIndRis><![CDATA[]]></BSAnagIndRis>
<BSAnagLocRis><![CDATA[NEW YORK]]></BSAnagLocRis>
<BSAnagTelRis></BSAnagTelRis>
<BSAnagFaxRis></BSAnagFaxRis>
</BSAnagRis>
<BSFornInd><![CDATA[]]></BSFornInd>
<BSFornLoc><![CDATA[]]></BSFornLoc>
<BSFornTel></BSFornTel>
<BSFornFax></BSFornFax>
</BookSeg>
<BookSeg>
<DetSeg>
<BSDataIni>2011-06-25</BSDataIni>
<BSDataFin>2011-06-25</BSDataFin>
<BSServType>TFTI</BSServType>
<BSServCod>NYCAPTHTL-O</BSServCod>
<BSServDes><![CDATA[TRANSFER HOTEL-APT NEW YORK]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>USA</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>2</BSservQtall>
<BSServQuota></BSServQuota>
<BSServCodSist></BSServCodSist>
<BSServCodTrat></BSServCodTrat>
<BSServSist><![CDATA[]]></BSServSist>
<BSservTrat><![CDATA[]]></BSservTrat>
</BSSservSpec>
<BSServFrom><![CDATA[AZ   642 FCO-EWR 25/06/11 13:45]]></BSServFrom>
<BSServTo><![CDATA[RADISSON LEXINGTON HOTEL]]></BSServTo>
<BSFornText>SERVIZIO FORNITO DA:</BSFornText>
<BSFornDescr><![CDATA[TEAM AMERICA INC]]></BSFornDescr>
<BSFornInd><![CDATA[125 PARK AVENUE, 2ND FLOOR]]></BSFornInd>
<BSFornLoc><![CDATA[NEW YORK]]></BSFornLoc>
<BSFornTel>001 212 6977165</BSFornTel>
<BSFornFax>Fax 7182471706</BSFornFax>
</BookSeg>
</BookSegServ>
</BookingFnp>
</AllBookingFnp>

XSLT:`

    <?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <html>
  <body>
  <h2>Liste des commandes</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Destination</th>
      <th>BSServQuota</th>
    </tr>
    <xsl:for-each select="AllBookingFnp/BookingFnp">
    <tr>
      <xsl:choose>
      <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='TUTU'">
      <td><xsl:value-of select="BookSegServ/BookSeg/DetSeg/BSServDest" /></td>
      <td><xsl:value-of select="BookSegServ/BookSeg/BSSservSpec/BSServQuota" /></td>
      </xsl:when>
      <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='SOHO'">
      <td><xsl:value-of select="BookSegServ/BookSeg/DetSeg/BSServDest" /></td>
      <td><xsl:value-of select="BookSegServ/BookSeg/BSSservSpec/BSServQuota" /></td>
      </xsl:when>
      <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='SOVI'">
      <td><xsl:value-of select="BookSegServ/BookSeg/DetSeg/BSServDest" /></td>
      <td><xsl:value-of select="BookSegServ/BookSeg/BSSservSpec/BSServQuota" /></td>
      </xsl:when>
      </xsl:choose>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

我得到的结果如下表所示:

目的地: GRECIT USA

BSServQuota: DBLCDM-

从XML文件中,信息是从第一个<BookingFnp>的第一个<DetSeg>中获取的,因为它可以看到存在的信息TUTU,但是在第二行中,它不能这样做,因为info TUTU/SOHO或SOVI在第一个<DetSeg>中不存在,但在第二个中.应该在第二个<DetSeg>中查找并验证'SOHO',然后从<BSServQuota>

中选择'DBL'

我希望它查看所有三个<DetSeg>并寻找值'TUTU',如果存在,请输入我想要的信息,否则寻找值'SOHO',否则寻找'SOVI'.

谢谢.

解决方案

我设法获得了答案,并使我的XSLT正常运行.我得到了专家的帮助,但我想我会分享答案: 迈克尔·凯(Michael Kay)使我走上了正确的轨道,但我一直无法独自做到,但无论如何,这是:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/AllBookingFnp">
        <html>
            <body>
                <h2>Liste des commandes</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Destination</th>
                        <th>BSServQuota</th>
                    </tr>
                    <xsl:apply-templates select="BookingFnp"></xsl:apply-templates>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="BookingFnp">
                <xsl:choose>
                    <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='TUTU'">
                        <xsl:apply-templates select="BookSegServ/BookSeg/DetSeg[BSServType='TUTU']"/>
                    </xsl:when>
                    <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='SOHO'">
                        <xsl:apply-templates select="BookSegServ/BookSeg/DetSeg[BSServType='SOHO']"/>
                    </xsl:when>
                    <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='SOVI'">
                        <xsl:apply-templates select="BookSegServ/BookSeg/DetSeg[BSServType='SOVI']"/>
                    </xsl:when>
                </xsl:choose>
    </xsl:template>

    <xsl:template match="DetSeg">
        <tr>
            <td><xsl:value-of select="BSServDest" /></td>
            <td><xsl:value-of select="parent::BookSeg/BSSservSpec/BSServQuota" /></td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

感谢所有试图帮助我的人.

I am relatively new to XSLT but am trying to learn it to provide a solution for a client. Although the ultimate aim is to write an XSLT for Filemaker Pro, I would like to first get the HTML one right.

I receive a generated XML file which contains booking information for tours. The informatio it contains as well as the number of orders also varies.

The XSLT is needed to present all the XML info in a more presentable table form.

My problems begin when I put in the conditional statements. In the example if the value of BSServType='TUTU', the table should reflect some information, otherwise it should look for the value 'SOHO' and if not 'SOVI'.

This particular tag is itself a child of DetSeg. There are several DetSeg tags. Unfortunately, the info may be in any 1 tag so the XSLT should be capable of looking into the right one and then choosing one of the values. I have not been able to do so.

The second problem is the statement that follows: when the value is 'TUTU', select 'BSServDest' seems to be working fine as it is a sibling to 'BSServType' but 'BSServQuota' is not a sibling but rather a 'nephew' if I can say so. This also is posing a problem as I am unable to select them

I hope I have been clear enough in my explainations. The XML as well as the XSLT have been pasted. I have tried looking arounf the site to seeif the problem has already been presented but have nout found anything to help me completely. I hope this problem can be solved as there are several more conditional statements that I will have to write all following the same logic.

Another doubt I have: is it asy to adapt th XSLT that I amwriting for Filemaker Pro later?

Thanking everyone in advance.

The XML code:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="order.xsl" type="text/xsl" ?>
<AllBookingFnp>
<BookingFnp>
<BookSegServ>
<BookSeg>
<DetSeg>
<BSDataIni>2011-06-25</BSDataIni>
<BSDataFin>2011-07-02</BSDataFin>
<BSCodTGeogr>LOC</BSCodTGeogr>
<BSCodCGeogr>ATH</BSCodCGeogr>
<BSDesGeogr><![CDATA[ATENE]]></BSDesGeogr>
<BSServType>TUTU</BSServType>
<BSServCod>GREMETEORE</BSServCod>
<BSServDes><![CDATA[TOUR GRECIA CLASSICA E METEORE]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>GRECIT</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>1</BSservQtall>
<BSServQuota>DBLCDM</BSServQuota>
<BSServCodSist>DBL</BSServCodSist>
<BSServCodTrat>CDM</BSServCodTrat>
<BSServSist><![CDATA[DOPPIA]]></BSServSist>
<BSservTrat><![CDATA[COME DA PROGRAMMA]]></BSservTrat>
</BSSservSpec>
<BSFornText>SERVIZIO FORNITO DA:</BSFornText>
<BSFornDescr><![CDATA[PANHELLAS]]></BSFornDescr>
<BSFornInd><![CDATA[EL.VENIZELOU 161 N.ERYTHREA 14671]]></BSFornInd>
<BSFornLoc><![CDATA[ATHENS]]></BSFornLoc>
<BSFornTel>0030 210 8003073</BSFornTel>
<BSFornFax>Fax 8003030</BSFornFax>
</BookSeg>
<BookSeg>
<DetSeg>
<BSDataIni>2011-07-02</BSDataIni>
<BSDataFin>2011-07-09</BSDataFin>
<BSCodTGeogr>LOC</BSCodTGeogr>
<BSCodCGeogr>HYDV</BSCodCGeogr>
<BSDesGeogr><![CDATA[HYDRA - GRECIA]]></BSDesGeogr>
<BSServType>SOVI</BSServType>
<BSServCod>GREHYDRABEAC</BSServCod>
<BSServDes><![CDATA[HYDRA BEACH - VILLAGGIO VALTUR]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>GRECIA</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>1</BSservQtall>
<BSServQuota>DBOCLAFV</BSServQuota>
<BSServCodSist>DBOCLA</BSServCodSist>
<BSServCodTrat>FV</BSServCodTrat>
<BSServSist><![CDATA[DOPPIA+letto uso doppia CLASSIC]]></BSServSist>
<BSservTrat><![CDATA[]]></BSservTrat>
</BSSservSpec>
<BSAnagRis>
<BSAnagDesRis><![CDATA[]]></BSAnagDesRis>
<BSAnagIndRis><![CDATA[A.E. PLEPI-THERMISIA]]></BSAnagIndRis>
<BSAnagLocRis><![CDATA[ERMIONI]]></BSAnagLocRis>
<BSAnagTelRis></BSAnagTelRis>
<BSAnagFaxRis></BSAnagFaxRis>
</BSAnagRis>
<BSServNoteDet><![CDATA[NOTA BENE: ALL'ARRIVO GLI OSPITI CHE NON UTILIZZANO I TRASPORTI VALTUR]]></BSServNoteDet>
<BSServNoteDet><![CDATA[SONO ATTESI DOPO LE ORE 16:00. IL GIORNO DELLA VOSTRA PARTENZA VI]]></BSServNoteDet>
<BSServNoteDet><![CDATA[INVITIAMO A LIBERARE LE STANZE PRIMA DELLE ORE 10:00.]]></BSServNoteDet>
<BSServNoteDet><![CDATA[**********************************************************************]]></BSServNoteDet>
<BSFornInd><![CDATA[]]></BSFornInd>
<BSFornLoc><![CDATA[]]></BSFornLoc>
<BSFornTel></BSFornTel>
<BSFornFax></BSFornFax>
</BookSeg>
</BookSegServ>
</BookingFnp>
<BookingFnp>
<BookSegServ>
<BookSeg>
<DetSeg>
<BSDataIni>2011-06-25</BSDataIni>
<BSDataFin>2011-06-25</BSDataFin>
<BSServType>TFTI</BSServType>
<BSServCod>NYCAPTHTL-I</BSServCod>
<BSServDes><![CDATA[TRANSFER APT NEW YORK-HOTEL]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>USA</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>2</BSservQtall>
<BSServQuota></BSServQuota>
<BSServCodSist></BSServCodSist>
<BSServCodTrat></BSServCodTrat>
<BSServSist><![CDATA[]]></BSServSist>
<BSservTrat><![CDATA[]]></BSservTrat>
</BSSservSpec>
<BSServFrom><![CDATA[AZ   642 FCO-EWR 25/06/11 13:45]]></BSServFrom>
<BSServTo><![CDATA[RADISSON LEXINGTON HOTEL]]></BSServTo>
<BSFornText>SERVIZIO FORNITO DA:</BSFornText>
<BSFornDescr><![CDATA[TEAM AMERICA INC]]></BSFornDescr>
<BSFornInd><![CDATA[125 PARK AVENUE, 2ND FLOOR]]></BSFornInd>
<BSFornLoc><![CDATA[NEW YORK]]></BSFornLoc>
<BSFornTel>001 212 6977165</BSFornTel>
<BSFornFax>Fax 7182471706</BSFornFax>
</BookSeg>
<BookSeg>
<DetSeg>
<BSDataIni>2011-06-25</BSDataIni>
<BSDataFin>2011-07-02</BSDataFin>
<BSServType>SOHO</BSServType>
<BSServCod>NYCLEXINGTON</BSServCod>
<BSServDes><![CDATA[RADISSON LEXINGTON HOTEL]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>USA</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>1</BSservQtall>
<BSServQuota>DBL</BSServQuota>
<BSServCodSist>DBL</BSServCodSist>
<BSServCodTrat></BSServCodTrat>
<BSServSist><![CDATA[DOPPIA]]></BSServSist>
<BSservTrat><![CDATA[]]></BSservTrat>
</BSSservSpec>
<BSAnagRis>
<BSAnagDesRis><![CDATA[]]></BSAnagDesRis>
<BSAnagIndRis><![CDATA[]]></BSAnagIndRis>
<BSAnagLocRis><![CDATA[NEW YORK]]></BSAnagLocRis>
<BSAnagTelRis></BSAnagTelRis>
<BSAnagFaxRis></BSAnagFaxRis>
</BSAnagRis>
<BSFornInd><![CDATA[]]></BSFornInd>
<BSFornLoc><![CDATA[]]></BSFornLoc>
<BSFornTel></BSFornTel>
<BSFornFax></BSFornFax>
</BookSeg>
<BookSeg>
<DetSeg>
<BSDataIni>2011-06-25</BSDataIni>
<BSDataFin>2011-06-25</BSDataFin>
<BSServType>TFTI</BSServType>
<BSServCod>NYCAPTHTL-O</BSServCod>
<BSServDes><![CDATA[TRANSFER HOTEL-APT NEW YORK]]></BSServDes>
<BSServTimeIni></BSServTimeIni>
<BSServDest>USA</BSServDest>
</DetSeg>
<BSSservSpec>
<BSservQtall>2</BSservQtall>
<BSServQuota></BSServQuota>
<BSServCodSist></BSServCodSist>
<BSServCodTrat></BSServCodTrat>
<BSServSist><![CDATA[]]></BSServSist>
<BSservTrat><![CDATA[]]></BSservTrat>
</BSSservSpec>
<BSServFrom><![CDATA[AZ   642 FCO-EWR 25/06/11 13:45]]></BSServFrom>
<BSServTo><![CDATA[RADISSON LEXINGTON HOTEL]]></BSServTo>
<BSFornText>SERVIZIO FORNITO DA:</BSFornText>
<BSFornDescr><![CDATA[TEAM AMERICA INC]]></BSFornDescr>
<BSFornInd><![CDATA[125 PARK AVENUE, 2ND FLOOR]]></BSFornInd>
<BSFornLoc><![CDATA[NEW YORK]]></BSFornLoc>
<BSFornTel>001 212 6977165</BSFornTel>
<BSFornFax>Fax 7182471706</BSFornFax>
</BookSeg>
</BookSegServ>
</BookingFnp>
</AllBookingFnp>

The XSLT:`

    <?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <html>
  <body>
  <h2>Liste des commandes</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Destination</th>
      <th>BSServQuota</th>
    </tr>
    <xsl:for-each select="AllBookingFnp/BookingFnp">
    <tr>
      <xsl:choose>
      <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='TUTU'">
      <td><xsl:value-of select="BookSegServ/BookSeg/DetSeg/BSServDest" /></td>
      <td><xsl:value-of select="BookSegServ/BookSeg/BSSservSpec/BSServQuota" /></td>
      </xsl:when>
      <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='SOHO'">
      <td><xsl:value-of select="BookSegServ/BookSeg/DetSeg/BSServDest" /></td>
      <td><xsl:value-of select="BookSegServ/BookSeg/BSSservSpec/BSServQuota" /></td>
      </xsl:when>
      <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='SOVI'">
      <td><xsl:value-of select="BookSegServ/BookSeg/DetSeg/BSServDest" /></td>
      <td><xsl:value-of select="BookSegServ/BookSeg/BSSservSpec/BSServQuota" /></td>
      </xsl:when>
      </xsl:choose>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

The result I am getting is the following in a table:

Destination: GRECIT USA

BSServQuota: DBLCDM -

From the XML file, the info is being taken from the first <DetSeg> from the first <BookingFnp> as it can see the info TUTU present but in the second row, it is unable to do so as the info TUTU/SOHO or SOVI is not present in the first <DetSeg> but in the second one. It is supposed to look in the second <DetSeg> and validate 'SOHO' and thus choose 'DBL' from <BSServQuota>

I would like it to look at all three <DetSeg> and look for the value 'TUTU', and if present, prsent the info I want, otherwise look for the value 'SOHO' and otherwise 'SOVI'.

Thanks.

解决方案

I managed to get the answer and get my XSLT working. I had the help of an expert but I thought I would share the answer: Michael Kay had put me on the right track but I had been unable to do it on my own but anyway here it is:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/AllBookingFnp">
        <html>
            <body>
                <h2>Liste des commandes</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Destination</th>
                        <th>BSServQuota</th>
                    </tr>
                    <xsl:apply-templates select="BookingFnp"></xsl:apply-templates>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="BookingFnp">
                <xsl:choose>
                    <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='TUTU'">
                        <xsl:apply-templates select="BookSegServ/BookSeg/DetSeg[BSServType='TUTU']"/>
                    </xsl:when>
                    <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='SOHO'">
                        <xsl:apply-templates select="BookSegServ/BookSeg/DetSeg[BSServType='SOHO']"/>
                    </xsl:when>
                    <xsl:when test="BookSegServ/BookSeg/DetSeg/BSServType='SOVI'">
                        <xsl:apply-templates select="BookSegServ/BookSeg/DetSeg[BSServType='SOVI']"/>
                    </xsl:when>
                </xsl:choose>
    </xsl:template>

    <xsl:template match="DetSeg">
        <tr>
            <td><xsl:value-of select="BSServDest" /></td>
            <td><xsl:value-of select="parent::BookSeg/BSSservSpec/BSServQuota" /></td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

Thanks to everyone who tried to help me.

这篇关于XSLT中的条件语句,当必须从多个元素中选择一个标记时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆