【问题标题】:XSLT 1.0 Group By TagsXSLT 1.0 按标签分组
【发布时间】:2013-03-17 16:55:02
【问题描述】:

我有以下 XML 数据:

  <result>
<row>
<CountryId>26</CountryId>
<CountryName>United Kingdom</CountryName>
<NoOfNights>1</NoOfNights>
<AccommodationID>6004</AccommodationID>
<RoomID>1</RoomID>
<RoomName>Double for Sole Use</RoomName>
<RatePlanID>1</RatePlanID>
<RoomRatePlan>Advance</RoomRatePlan>
<NoOfSameTypeRoom>0</NoOfSameTypeRoom>
<RoomSize/>
<Max_Person>1</Max_Person>
<RackRate>189</RackRate>
<CurrencySymbol>&pound;</CurrencySymbol>
<NoOfRoomsAvailable>4</NoOfRoomsAvailable>
<Rate>79.00</Rate>
<RatePerDay>27 Mar 2013_79.00</RatePerDay>
</row>
<row>
<CountryId>26</CountryId>
<CountryName>United Kingdom</CountryName>
<NoOfNights>1</NoOfNights>
<AccommodationID>6004</AccommodationID>
<RoomID>1</RoomID>
<RoomName>Double for Sole Use</RoomName>
<RatePlanID>2</RatePlanID>
<RoomRatePlan>Standard</RoomRatePlan>
<NoOfSameTypeRoom>0</NoOfSameTypeRoom>
<RoomSize/>
<Max_Person>1</Max_Person>
<RackRate>189</RackRate>
<CurrencySymbol>&pound;</CurrencySymbol>
<NoOfRoomsAvailable>5</NoOfRoomsAvailable>
<Rate>89.00</Rate>
<RatePerDay>27 Mar 2013_89.00</RatePerDay>
</row>
<row>
<CountryId>26</CountryId>
<CountryName>United Kingdom</CountryName>
<NoOfNights>1</NoOfNights>
<AccommodationID>6004</AccommodationID>
<RoomID>2</RoomID>
<RoomName>Double Room</RoomName>
<RatePlanID>1</RatePlanID>
<RoomRatePlan>Advance</RoomRatePlan>
<NoOfSameTypeRoom>0</NoOfSameTypeRoom>
<RoomSize/>
<Max_Person>2</Max_Person>
<RackRate>199</RackRate>
<CurrencySymbol>&pound;</CurrencySymbol>
<NoOfRoomsAvailable>5</NoOfRoomsAvailable>
<Rate>89.00</Rate>
<RatePerDay>27 Mar 2013_89.00</RatePerDay>
</row>
 </result>

我的上述 xml 的 XSLT 是这样的:

<?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/row">
        <result>
          <hotel_rooms>
            <xsl:element name="hotel_id">
              <xsl:value-of select="AccommodationID"/>
            </xsl:element>
            <xsl:apply-templates />
          </hotel_rooms>
          <xsl:element name="Rate">
            <xsl:element name="RoomRatePlan">
              <xsl:value-of select="RoomRatePlan"/>
            </xsl:element>
            <xsl:element name="numeric_price">
              <xsl:value-of select="Rate"/>
            </xsl:element>
          </xsl:element>
        </result>
      </xsl:for-each>
    </hotels>
  </xsl:template>

  <!-- Elements to be copied as they are -->

  <xsl:template match="NoOfNights|RoomName|RoomSize|Max_Person|RackRate|RatePerDay|CurrencySymbol|NoOfRoomsAvailable|RoomDescription|RoomFacilities|PolicyComments|Breakfast|Policy|Message">
    <xsl:copy-of select="." />
  </xsl:template>

  <xsl:template match="Photo_Max60">
    <RoomImages>
      <Photo_Max60>
        <xsl:value-of select="." />
      </Photo_Max60>
      <Photo_Max300>
        <xsl:value-of select="../Photo_Max300" />
      </Photo_Max300>
      <Photo_Max500>
        <xsl:value-of select="../Photo_Max500" />
      </Photo_Max500>
    </RoomImages>
  </xsl:template>
</xsl:stylesheet>

在 XSLT 1.0 中,我想按 Room ID 和 Hotel ID 进行分组。所以在上面的数据中,我想要这样的结果。

<hotels>
     <result>
      <hotel_rooms>
        <hotel_id>6004</hotel_id>
        <NoOfNights>1</NoOfNights>
        <RoomID>1</RoomID>
        <RoomName>Double for Sole Use</RoomName>
        <RoomSize/>
        <Max_Person>1</Max_Person>
        <RackRate>189</RackRate>
        <CurrencySymbol>&pound;</CurrencySymbol>
        <NoOfRoomsAvailable>4</NoOfRoomsAvailable>
        <RatePerDay>27 Mar 2013_79.00</RatePerDay>
     </hotel_rooms>
     <Rate>
     <RoomRatePlan>Advance</RoomRatePlan>
     <numeric_price>79.00</numeric_price>
     <RoomRatePlan>Standard</RoomRatePlan>
      <numeric_price>89.00</numeric_price>
     </Rate>
    </result>
    </result>
    <hotels>

我想要一个用于上述 xml 输出的 xslt 文件。请帮助..

【问题讨论】:

    标签: asp.net xml wcf xslt xslt-1.0


    【解决方案1】:

    孟池法:

    <?xml version="1.0" encoding="utf-8" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output indent="yes" />
        <xsl:key name="room-per-hotel" match="result" use="concat(hotel_rooms/hotel_id, '-', hotel_rooms/RoomID)" />
        <xsl:template match="/">
            <hotels>
                <xsl:for-each select="hotels/result[count(. | key('room-per-hotel', concat(hotel_rooms/hotel_id, '-', hotel_rooms/RoomID))[1]) = 1]">
                    <xsl:sort select="concat(hotel_rooms/hotel_id, '-', hotel_rooms/RoomID)" />
                    <result>
                        <xsl:copy-of select="hotel_rooms"/>
                        <Rate>
                            <xsl:copy-of select="key('room-per-hotel', concat(hotel_rooms/hotel_id, '-', hotel_rooms/RoomID))/Rate/*"/>
                        </Rate>
                    </result>
                </xsl:for-each>
            </hotels>
        </xsl:template>
    </xsl:stylesheet>
    

    Working example

    【讨论】:

    • 对不起,我的 xml 是现在编辑的。最后一个 xml 输出是来自 xslt 文件的输出。现在我拥有的核心 xml 是我必须转换该 xml 的最重要的,请帮助。
    • 您的回答非常有用,它帮助我制作了我的 xslt。它工作得很好,谢谢您的帮助。
    【解决方案2】:

    好吧,您的输入和您想要的结果都不是格式正确的,标签没有正确关闭,并且存在对未声明实体的实体引用 &amp;pound;,但是如果您想使用 XSLT 1.0 进行分组,请查看以下 XSLT 1.0 示例使用 Muenchian grouping:

    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0">
    
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:key name="group" match="result" use="concat(hotel_rooms/hotel_id, '|', hotel_rooms/RoomID)"/>
    
    <xsl:template match="hotels">
      <xsl:copy>
        <xsl:apply-templates select="result[generate-id() = generate-id(key('group', concat(hotel_rooms/hotel_id, '|', hotel_rooms/RoomID))[1])]"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="result">
      <xsl:copy>
        <xsl:copy-of select="hotel_rooms"/>
        <Rate>
          <xsl:copy-of select="key('group', concat(hotel_rooms/hotel_id, '|', hotel_rooms/RoomID))/Rate/*"/>
        </Rate>
      </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    它会变形

    <hotels>
     <result>
      <hotel_rooms>
        <hotel_id>6004</hotel_id>
        <NoOfNights>1</NoOfNights>
        <RoomID>1</RoomID>
        <RoomName>Double for Sole Use</RoomName>
        <RoomSize/>
        <Max_Person>1</Max_Person>
        <RackRate>189</RackRate>
        <CurrencySymbol>pound</CurrencySymbol>
        <NoOfRoomsAvailable>4</NoOfRoomsAvailable>
        <RatePerDay>27 Mar 2013_79.00</RatePerDay>
     </hotel_rooms>
     <Rate>
     <RoomRatePlan>Advance</RoomRatePlan>
     <numeric_price>79.00</numeric_price>
     </Rate>
    </result>
    <result>
     <hotel_rooms>
      <hotel_id>6004</hotel_id>
      <NoOfNights>1</NoOfNights>
      <RoomID>1</RoomID>
      <RoomName>Double for Sole Use</RoomName>
      <RoomSize/>
      <Max_Person>1</Max_Person>
      <RackRate>189</RackRate>
      <CurrencySymbol>pound</CurrencySymbol>
      <NoOfRoomsAvailable>5</NoOfRoomsAvailable>
      <RatePerDay>27 Mar 2013_89.00</RatePerDay>
     </hotel_rooms>
      <Rate>
      <RoomRatePlan>Standard</RoomRatePlan>
      <numeric_price>89.00</numeric_price>
      </Rate>
    </result>
    </hotels>
    

    进入

    <hotels>
      <result>
        <hotel_rooms>
          <hotel_id>6004</hotel_id>
          <NoOfNights>1</NoOfNights>
          <RoomID>1</RoomID>
          <RoomName>Double for Sole Use</RoomName>
          <RoomSize />
          <Max_Person>1</Max_Person>
          <RackRate>189</RackRate>
          <CurrencySymbol>pound</CurrencySymbol>
          <NoOfRoomsAvailable>4</NoOfRoomsAvailable>
          <RatePerDay>27 Mar 2013_79.00</RatePerDay>
        </hotel_rooms>
        <Rate>
          <RoomRatePlan>Advance</RoomRatePlan>
          <numeric_price>79.00</numeric_price>
          <RoomRatePlan>Standard</RoomRatePlan>
          <numeric_price>89.00</numeric_price>
        </Rate>
      </result>
    </hotels>
    

    【讨论】:

    • 对不起,我的 xml 是现在编辑的。最后一个 xml 输出是来自 xslt 文件的输出。现在我拥有的核心 xml 是我必须转换该 xml 的最重要的,请帮助。
    • 你的问题现在没有任何意义...尝试学习如何在 XSLT 1.0 中对项目进行分组。例如:stackoverflow.com/questions/13740863/…
    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 2010-12-26
    • 2021-11-20
    • 2018-03-28
    • 2021-12-17
    • 2023-04-04
    • 2020-09-05
    • 2012-12-01
    相关资源
    最近更新 更多