2013-03-27 7 views
0

я следующий XML-данные:XSLT 1.0 Группа Теги

<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> 

Мой XSLT для приведенного выше XML заключается в следующем:

<?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, я хочу группе номер 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> 

Я хочу файл XSLT для вывода выше XML я need.please помочь ..

ответ

1

Muenchian метод:

<?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

+0

Извините, мой xml - это тот, который теперь редактирует xml-выход now.last, который выходит от xslt file.now ядро ​​xml у меня есть верхняя часть, которую я должен преобразовать в xml, пожалуйста, помогите. – MSalmanSabir

+0

Ваш ответ очень полезен, он помогает мне сделать мой xslt.and, он отлично работает за вашу помощь. – MSalmanSabir

0

Ну ни ваш вход ни ваш разыскиваемый результат хорошо сформированным с бирками не закрыта должным образом и существование ссылка на объект &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> 
+0

извините мой XML это, который редактировать now.last вывод XML в том, что выход, который приходит из файла XSLT. теперь ядро ​​xml у меня есть топ, я должен преобразовать этот xml, пожалуйста, помогите. – MSalmanSabir

+1

Теперь ваш вопрос не имеет никакого смысла ... Попробуйте научиться группировать элементы в XSLT 1.0. см. например: http://stackoverflow.com/questions/13740863/how-to-group-elements-in-xslt/13763445#13763445 – Joep

Смежные вопросы