2013-05-20 4 views
0

Я знаю, что были и другие вопросы по этой теме, но то, что я ищу, не существует.Слияние XML в разных последовательностях

Что я хочу сделать, это объединить 2 XML-файла, но не один XML-файл за другим.

Например мой первый файл XML будет game.xml:

<forSale> 
<game> 
    <title>Mass Effect 3</title> 
    <releaseDate> 
     <yyyy>2012</yyyy> 
     <mm>03</mm> 
     <dd>06</dd> 
    </releaseDate> 
    <esrbRating>M</esrbRating> 
    <platforms> 
     <platform>X360</platform> 
    </platforms> 
</game> 
<game> 
    <title>Borderlands 2</title> 
    <releaseDate> 
     <yyyy>2012</yyyy> 
     <mm>09</mm> 
     <dd>18</dd> 
    </releaseDate> 
    <esrbRating>M</esrbRating> 
    <platforms> 
     <platform>PC</platform> 
    </platforms> 
</game> 

И мой второй XML-файл reviews.xml

<reviews> 
<game> 
    <title>Mass Effect 3</title> 
    <review> 
     <critic>Kevin VanOrd</critic> 
     <pros> 
      <pro><![CDATA[Fantastic, moving story that balances plot and character]]></pro> 
     </pros> 
     <cons> 
      <con><![CDATA[Some glitches and bugs]]></con> 
     </cons> 
    </review> 
</game> 

<game> 
    <title>Borderlands 2</title> 
    <review> 
     <critic>Chris Watters</critic> 
     <pros> 
      <pro><![CDATA[A ton of great mission writing and dialogue]]></pro> 
     </pros> 
     <cons> 
      <con><![CDATA[Spoken messages sometimes interrupt each other]]></con> 
     </cons> 
    </review> 
</game> 

И я хочу, чтобы мои итоговый XML-файл должен быть таким:

<forSale> 
<game> 
    <title>Mass Effect 3</title> 
    <releaseDate> 
     <yyyy>2012</yyyy> 
     <mm>03</mm> 
     <dd>06</dd> 
    </releaseDate> 
    <esrbRating>M</esrbRating> 
    <platforms> 
     <platform>X360</platform> 
    </platforms> 
    <review> 
     <critic>Kevin VanOrd</critic> 
     <synopsis> 
      Mass Effect 3 is a remarkably satisfying conclusion to a beloved trilogy, and a poignant and memorable role-playing action game in its own right. 
     </synopsis> 
     <pros> 
      <pro>Fantastic, moving story that balances plot and character</pro> 
     </pros> 
     <cons> 
      <con>Some glitches and bugs</con> 
     </cons> 
    </review> 
</game> 
<game> 
    <title>Borderlands 2</title> 
    <releaseDate> 
     <yyyy>2012</yyyy> 
     <mm>09</mm> 
     <dd>18</dd> 
    </releaseDate> 
    <esrbRating>M</esrbRating> 
    <platforms> 
     <platform>PC</platform> 
    </platforms> 
    <review> 
     <critic>Chris Watters</critic> 
     <synopsis> 
      Stellar writing and a host of small improvements help Borderlands 2 stand tall on the shoulders of its predecessor. 
     </synopsis> 
     <pros> 
      <pro>A ton of great mission writing and dialogue</pro> 
     </pros> 
     <cons> 
      <con>Spoken messages sometimes interrupt each other</con> 
     </cons> 
    </review> 
</game> 

Я попробовал этот код, но он выводит игры первым, то отзывы

<xsl:template match="/forSale"> 
<xsl:copy> 
    <xsl:apply-templates select="game"/> 
    <xsl:apply-templates select="document('reviews.xml')/reviews/game/review"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match =" @* | node()"> 
<xsl:copy> 
    <xsl:apply-templates select="@* | node() | text()"/> 
</xsl:copy> 
</xsl:template> 

ответ

1

Это происходит потому, что эта линия ...

<xsl:apply-templates select="document('reviews.xml')/reviews/game/review"/> 

не зависит от предыдущего лайн, где вы выбираете игры, и поэтому копирует все игры, а не только определенную строку.

Что вам нужно сделать, это больше эту строку в шаблон, который соответствует играм элемента и изменить его, чтобы вывести выбранную игру только

<xsl:apply-templates select="document('reviews.xml')/reviews/game[title=current()/title]/review"/> 

Попробуйте XSLT

<xsl:template match="/forSale"> 
    <xsl:copy> 
     <xsl:apply-templates select="game"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="game"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node() | text()"/> 
     <xsl:apply-templates select="document('reviews.xml')/reviews/game[title=current()/title]/review"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match =" @* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node() | text()"/> 
    </xsl:copy> 
</xsl:template> 
+0

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

+1

Упс! Виноват! Я пропустил ключевую строку для копирования существующих узлов под элементом игры. Ответ теперь исправлен. –

+0

Thanx много, ты помог был очень полезен –

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