Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Как преобразовать динамический XML?


Автор: twinsen 15.3.2011, 17:46
Есть например вот такой XML
Код

<OrderInfoResponse Id="1798309" Name="ABCD">
  <Success/>
  <AccommodationList>
    <Accommodation Id="2474072" Name="Accommodation 01">
      <Persons>
        <Person LastName="00_АСТАНИН" FirstName="00_АНДРЕЙ"/>
      </Persons>
    </Accommodation>
    <Accommodation Id="2474073" Name="Accommodation 02">
      <Persons>
        <Person LastName="11_АСТАНИН" FirstName="11_АНДРЕЙ"/>
      </Persons>
      <Persons>
        <Person LastName="22_АСТАНИН" FirstName="22_АСТАНИН"/>
      </Persons>
    </Accommodation>
  </AccommodationList>
</OrderInfoResponse>

В одном OrderInfoResponse может быть энное количество AccommodationList с уникальным номером,
а в AccommodationList может быть энное количество Persons
Мне надо преобразовать XML  в такой формат XML (Средствами XSL)
Код

<?xml version="1.0" encoding="utf-8"?>
<dataroot>-
  <OrderInfoResponse>
    <Id>1798309</Id>
    <Name>ABCD</Name>
  </OrderInfoResponse>
  <AccommodationList>
    <OrderInfoResponseId>1798309</OrderInfoResponseId>
    <Id>2474072</Id>
    <Name>Accommodation 01</Name>   
  </AccommodationList>
  <AccommodationList>
    <OrderInfoResponseId>1798309</OrderInfoResponseId>
    <Id>2474073</Id>
    <Name>Accommodation 02</Name>
  </AccommodationList>
  <PersonList>
    <AccommodationId>2474072</AccommodationId>
    <LastName>00_АСТАНИН</LastName>
    <FirstName>00_АНДРЕЙ</FirstName>
  </PersonList>
  <PersonList>
    <AccommodationId>2474073</AccommodationId>
    <LastName>11_АСТАНИН</LastName>
    <FirstName>11_АНДРЕЙ</FirstName>
  </PersonList>
  <PersonList>
    <AccommodationId>2474073</AccommodationId>
    <LastName>22_АСТАНИН</LastName>
    <FirstName>22_АНДРЕЙ</FirstName>
  </PersonList>
</dataroot>


Подскажите плиз, возможно ли такое преобразование?  smile 

Автор: diadiavova 15.3.2011, 17:52
Цитата(twinsen @  15.3.2011,  17:46 Найти цитируемый пост)
 возможно ли такое преобразование? 

Возможно. А какие с этим проблемы то? smile 

Автор: twinsen 15.3.2011, 18:03
Основная проблема в том что это для меня ново!

Проблема выбрать часть Person только для определенного AccommodationId

Автор: diadiavova 15.3.2011, 18:07
Цитата(twinsen @  15.3.2011,  18:03 Найти цитируемый пост)
Проблема выбрать часть Person только для определенного AccommodationId

Person[Ancestor::Accommodation[@Id='2474072']]

Автор: twinsen 16.3.2011, 09:47
так уже пробовал...
подскажите плиз где лажа (ошибка)... 
Код

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <dataroot>
      <xsl:for-each select="//OrderInfoResponse">
        <OrderInfoResponse>
          <Id>
            <xsl:value-of select="@Id"/>
            <xsl:variable name="POrderInfoResponseId" select="@Id"/>
          </Id>
          <Name>
            <xsl:value-of select="@Name"/>
          </Name>
        </OrderInfoResponse>
        <xsl:for-each select="//OrderInfoResponse/AccommodationList/Accommodation">
          <AccommodationList>
            <OrderInfoResponseId>
              <xsl:value-of select="$POrderInfoResponseId"/>
            </OrderInfoResponseId>
            <Id>
              <xsl:value-of select="@Id"/>
              <xsl:variable name="PAccommodationId" select="@Id"/>
            </Id>
            <Name>
              <xsl:value-of select="@Name"/>
            </Name>
          </AccommodationList>
          <!--Person[Ancestor::Accommodation[@Id='2474072']]-->
          <xsl:for-each select="//OrderInfoResponse/AccommodationList/Accommodation/Persons/Person[Ancestor:Accommodation[@Id=$PAccommodationId]]">
            <Person>
              <AccommodationId>
                <xsl:value-of select="$PAccommodationId"/>
              </AccommodationId>
              <LastName>
                <xsl:value-of select="@LastName"/>
              </LastName>
              <FirstName>
                <xsl:value-of select="@FirstName"/>
              </FirstName>
            </Person>
          </xsl:for-each>
        </xsl:for-each>
      </xsl:for-each>
    </dataroot>
  </xsl:template>
</xsl:stylesheet>
 

Автор: twinsen 16.3.2011, 10:22
удалось решить так  smile 
diadiavova Спасибо!
Код

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <dataroot>
      <xsl:for-each select="//OrderInfoResponse">
        <OrderInfoResponse>
          <Id>
            <xsl:value-of select="@Id"/>
            <xsl:variable name="POrderInfoResponseId" select="@Id"/>
          </Id>
          <Name>
            <xsl:value-of select="@Name"/>
          </Name>
        </OrderInfoResponse>
        <xsl:for-each select="/OrderInfoResponse/AccommodationList/Accommodation">
          <AccommodationList>
            <OrderInfoResponseId>
              <xsl:value-of select="$POrderInfoResponseId"/>
            </OrderInfoResponseId>
            <Id>
              <xsl:value-of select="@Id"/>
              <xsl:variable name="PAccommodationId" select="@Id"/>
            </Id>
            <Name>
              <xsl:value-of select="@Name"/>
            </Name>
          </AccommodationList>
          <xsl:for-each select="Persons/Person">
            <Person>
              <AccommodationId>
                <xsl:value-of select="$PAccommodationId"/>
              </AccommodationId>
              <LastName>
                <xsl:value-of select="@LastName"/>
              </LastName>
              <FirstName>
                <xsl:value-of select="@FirstName"/>
              </FirstName>
            </Person>
          </xsl:for-each>
        </xsl:for-each>
      </xsl:for-each>
    </dataroot>
  </xsl:template>
</xsl:stylesheet>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)