Я относительно новичок в XSLT, но пытаюсь узнать, как обеспечить решение для клиента. Хотя конечной целью является написание XSLT для Filemaker Pro, я хотел бы сначала получить правильный HTML-код.
Я получил сгенерированный файл XML, который содержит информацию о бронировании туров. Информация, которую он содержит, а также количество заказов также варьируется.
XSLT необходим для представления всей информации XML в более представительной табличной форме.
Мои проблемы начинаются, когда я ставлю условные выражения. В примере, если значение BSServType = 'TUTU', таблица должна отражать некоторую информацию, в противном случае она должна искать значение 'SOHO', а если нет, то 'SOVI'.
Этот конкретный тег сам по себе является потомком DetSeg. Есть несколько тегов DetSeg. К сожалению, информация может быть в любом 1 теге, поэтому XSLT должен быть в состоянии найти правильный и затем выбрать одно из значений. Я не смог этого сделать.
Вторая проблема заключается в следующем утверждении: когда значение равно «TUTU», выберите «BSServDest», кажется, работает нормально, так как он является «родным» для «BSServType», но «BSServQuota» не является родным, а скорее « племянник, если я могу так сказать. Это также создает проблему, так как я не могу выбрать их
Надеюсь, я был достаточно ясен в своих объяснениях. XML и XSLT были вставлены. Я попытался посмотреть на сайте, чтобы увидеть, если проблема уже была представлена, но не нашел ничего, что могло бы помочь мне полностью. Я надеюсь, что эта проблема может быть решена, поскольку есть еще несколько условных утверждений, которые мне придется написать, следуя той же логике.
У меня есть еще одно сомнение: а адаптировать ли я XSLT, который я пишу для Filemaker Pro, позже?
Спасибо всем заранее.
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-файла информация берется из первого <DetSeg>
из первого <BookingFnp>
, поскольку он может видеть информацию о пачке TUTU, но во второй строке он не может сделать это, как информация TUTU / SOHO или SOVI присутствует не в первом <DetSeg>
, а во втором. Он должен смотреть во втором <DetSeg>
и проверять 'SOHO' и таким образом выбирать 'DBL' из <BSServQuota>
Я бы хотел, чтобы он посмотрел на все три <DetSeg>
и посмотрел на значение 'TUTU', и, если он присутствует, представил нужную мне информацию, в противном случае ищите значение 'SOHO' и в противном случае 'SOVI'.
Спасибо.