0

私のXMLファイル:

<result>
    <xml_acc>
        <CheckInFrom>01:15</CheckInFrom>
        <CheckInTo>00:30</CheckInTo>
        <CheckOutFrom>00:45</CheckOutFrom>
        <CheckOutTo>01:15</CheckOutTo>
        <hotel_id>1</hotel_id>
        <name>Tahir Hotel</name>
        <hoteltype>Tahir Hotel</hoteltype>
        <CityID>1</CityID>
        <city>London</city>
        <CountryID>26</CountryID>
        <CurrencyId>26</CurrencyId>
        <languagecode>1</languagecode>
        <Latitude>13131313</Latitude>
        <Longitude>11131131</Longitude>
        <max_persons_in_reservation>1000</max_persons_in_reservation>
        <ranking>1</ranking>
        <url>123Testing</url>
        <zip>W2 6DX</zip>
    </xml_acc>
    <xml_acc>
        <CheckInFrom>01:15</CheckInFrom>
        <CheckInTo>00:30</CheckInTo>
        <CheckOutFrom>00:45</CheckOutFrom>
        <CheckOutTo>01:15</CheckOutTo>
        <hotel_id>1</hotel_id>
        <name>Tahir Hotel</name>
        <hoteltype>Tahir Hotel</hoteltype>
        <CityID>1</CityID>
        <city>London</city>
        <CountryID>26</CountryID>
        <CurrencyId>26</CurrencyId>
        <languagecode>1</languagecode>
        <Latitude>13131313</Latitude>
        <Longitude>11131131</Longitude>
        <max_persons_in_reservation>1000</max_persons_in_reservation>
        <ranking>1</ranking>
        <url>123Testing</url>
        <zip>W2 6DX</zip>
    </xml_acc>
</result>

次の XSLT を適用しています。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"  method="html" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="xml_acc">
      <result>
    <!--<xsl:apply-templates select="node()[not(self::CheckInTo) and not(self::CheckInFrom)][not(self::CheckOutTo) and not(self::CheckOutFrom)]"/>-->
    <Address>
      <xsl:apply-templates select="Address"/>
    </Address>
    <checkin>
      <from>
        <xsl:apply-templates select="CheckInTo"/>
      </from>
      <to>
        <xsl:apply-templates select="CheckInFrom"/>
      </to>
    </checkin>
    <city>
      <xsl:apply-templates select="city"/>
    </city>
    <city_id>
     <xsl:apply-templates select="CityID"/>
    </city_id>
    <Location>
      <Latitude>
          <xsl:apply-templates select="Latitude"/>
        </Latitude>
        <Longitude>
          <xsl:apply-templates select="Longitude"/>
        </Longitude>
    </Location>
    <city_id>
      <xsl:apply-templates select="CityID"/>
    </city_id>
    <max_persons_in_reservation>
      <xsl:apply-templates select="max_persons_in_reservation"/>
    </max_persons_in_reservation>
    <name>
      <xsl:apply-templates select="name"/>
    </name>
    <ranking>
      <xsl:apply-templates select="ranking"/>
    </ranking>
    <url>
      <xsl:apply-templates select="url"/>
    </url>
    <zip>
      <xsl:apply-templates select="zip"/>
    </zip>
      </result>
  </xsl:template>
</xsl:stylesheet>

そして、私は結果を得ています:

<result>
    <Address>
    </Address>
    <checkin>
        <from>00:30</from>
        <to>01:15</to>
    </checkin>
    <city>London</city>
    <city_id>1</city_id>
    <Location>
        <Latitude>13131313</Latitude>
        <Longitude>11131131</Longitude>
    </Location>
    <city_id>1</city_id>
    <max_persons_in_reservation>1000</max_persons_in_reservation>
    <name>Tahir Hotel</name>
    <ranking>1</ranking>
    <url>123Testing</url>
    <zip>W2 6DX</zip>
</result>
<result>
    <Address></Address>
    <checkin>
        <from>00:30</from>
        <to>01:15</to>
    </checkin>
    <city>London</city>
    <city_id>1</city_id>
    <Location>
        <Latitude>13131313</Latitude>
        <Longitude>11131131</Longitude>
    </Location>
    <city_id>1</city_id>
    <max_persons_in_reservation>1000</max_persons_in_reservation>
    <name>Tahir Hotel</name>
    <ranking>1</ranking>
    <url>123Testing</url>
    <zip>W2 6DX</zip>
</result>

私の XSLT は、複数のルート タグを含む XML を生成しています。1 つのルート要素が必要で、このタグには複数のタグが表示される必要があります。私はこのような結果が欲しい:

<hotels>
   <result>
    <Address>
    </Address>
    <checkin>
        <from>00:30</from>
        <to>01:15</to>
    </checkin>
    <city>London</city>
    <city_id>1</city_id>
    <Location>
        <Latitude>13131313</Latitude>
        <Longitude>11131131</Longitude>
    </Location>
    <city_id>1</city_id>
    <max_persons_in_reservation>1000</max_persons_in_reservation>
    <name>Tahir Hotel</name>
    <ranking>1</ranking>
    <url>123Testing</url>
    <zip>W2 6DX</zip>
</result>
<result>
    <Address></Address>
    <checkin>
        <from>00:30</from>
        <to>01:15</to>
    </checkin>
    <city>London</city>
    <city_id>1</city_id>
    <Location>
        <Latitude>13131313</Latitude>
        <Longitude>11131131</Longitude>
    </Location>
    <city_id>1</city_id>
    <max_persons_in_reservation>1000</max_persons_in_reservation>
    <name>Tahir Hotel</name>
    <ranking>1</ranking>
    <url>123Testing</url>
    <zip>W2 6DX</zip>
  </result>
</hotels>

この問題を解決するのを手伝ってください。ここから私のページにテキストをコピーして貼り付けることで、あなたの提案を確認できるテストページを作成しました. 以下は、コードをテストするためのリンクです。

http://shahbaz.somee.com/Default.aspx

4

2 に答える 2

1

私は追加します:

<xsl:template match="/">
   <hotels>
      <xsl:apply-templates select="result/xml_acc"/>
   </hotels>
</xsl:template>
于 2013-02-13T20:54:50.147 に答える
0

Goran が提供した答えは正しいので、コードを修正する必要があります。

それでも、元のコードの一部を書き直したソリューションを投稿するつもりです。これは、XSLT の哲学に沿ったものであり、維持しやすいと思うからです。ただし、出力は少し異なります。ソース ドキュメントに表示されない要素は、結果ドキュメント (例: Address) にコピーされず、要素が出力される順序が異なります。

<?xml version="1.0" encoding="utf-8" ?>

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

<xsl:output omit-xml-declaration="yes" indent="yes" method="xml" />
<xsl:strip-space elements="*"/>

<!-- Default template : ignore unrecognized elements and text -->
<xsl:template match="*|text()" />

<!-- Match document root : add hotels element and process each children node of result -->
<xsl:template match="/">
    <hotels>
        <!-- We assume that the XML documents are always going to follow the structure:
             result as the root node and xml_acc elements as its children -->
        <xsl:for-each select="result/xml_acc">
            <result>
                <xsl:apply-templates />
            </result>
        </xsl:for-each>
    </hotels>
</xsl:template>

<!-- Elements to be copied as they are -->
<xsl:template match="Address|city|max_persons_in_reservation|name|ranking|url|zip">
    <xsl:copy-of select="." />
</xsl:template>

<!-- Mapping CityID to city_id-->
<xsl:template match="CityID">
    <city_id>
        <xsl:value-of select="." />
    </city_id>
</xsl:template>

<!-- Elements which need to be joined with sibling elements -->

<xsl:template match="CheckInFrom">
    <checkin>
        <from><xsl:value-of select="." /></from>
        <to><xsl:value-of select="../CheckInTo" /></to>
    </checkin>
</xsl:template>

<xsl:template match="Latitude">
    <Location>
        <xsl:copy-of select=".|../Longitude" />
    </Location>
</xsl:template>

</xsl:stylesheet>
于 2013-02-13T22:16:47.223 に答える