Как соединить два файла XML с совпадающим узлом

Мне нужно найти способ соединить два XML-файла, когда у них есть соответствующий узел. Насколько я понимаю, это можно сделать на многих разных языках ... есть ли способ сделать это с помощью PHP или AJAX? Из других сообщений на SO я вижу решения XSLT .. которые я действительно не понимаю. Это лучший / предпочтительный метод? Если да, то знаете какие-нибудь полезные руководства по XSLT?

Например, XML-1 похож на:

<FOO>
    </A>
    </B>
    </C>
    </D>
</FOO>

и XML-2:

<FOO>    
    </B>
    </E>
</FOO>

Как лучше всего проверить, где == < B> затем добавьте

Обновление

Ну, я не могу заставить это работать с моим гипотетическим примером, и подумал, что обновлю то, что я действительно делаю, чтобы увидеть, может ли кто-нибудь помочь мне понять этот. Я пробовал методы ниже и другие, которые я нашел на SO, но безуспешно.

Реальная схема выглядит так:

file1.xml

<?xml version="1.0"?>
<DATA>
  <ITEM>
    <PRODUCT_TYPE>simple</PRODUCT_TYPE>
    <STYLE_COLOR>1524740007</STYLE_COLOR>
    <SHORT_DESCRIPTION>Black Shoe</SHORT_DESCRIPTION>
    <CLASS_NAME>FOOTWEAR</CLASS_NAME>
    <STATUS>Disabled</STATUS>
  </ITEM>
 ...
</DATA>

file2.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="merge.xsl" ?>
<DATA>
  <ITEM>
    <STYLE_COLOR>1524740007</STYLE_COLOR>
    <NEXT_ARRIVAL>2011-08-05</NEXT_ARRIVAL>
  </ITEM>
  ....
</DATA>

Мне нужно выяснить, чтобы создать новый XML-файл, который объединит эти узлы с идентичным SYTLE_COLOR и будет выглядеть так:

<DATA>
  <ITEM>
    <PRODUCT_TYPE>simple</PRODUCT_TYPE>
    <STYLE_COLOR>1524740007</STYLE_COLOR>
    <SHORT_DESCRIPTION>Black Shoe</SHORT_DESCRIPTION>
    <CLASS_NAME>FOOTWEAR</CLASS_NAME>
    <NEXT_ARRIVAL>2011-08-05</NEXT_ARRIVAL>
    <STATUS>Disabled</STATUS>
  </ITEM>

Я попытался создать merge.xsl, который выглядит так:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes" />
  <xsl:output indent="yes"/>
  <xsl:variable name="with" select="'file-2.xml'" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="scene">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
      <xsl:variable name="info" select="document($with)/DATA/ITEM[STYLE_COLOR=current()/STYLE_COLOR]/." />
      <xsl:for-each select="$info/*">
        <xsl:if test="name()!='STYLE_COLOR'">
          <xsl:copy-of select="." />
        </xsl:if>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>
</xsl:transform>

Я также пробовал выполнить слияние следующим образом:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:variable name="input2" select="document('file-2.xml')/DATA/ITEM"/>
    <xsl:template match="STYLE_COLOR">
        <xsl:copy>
            <xsl:apply-templates select="*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:choose>
            <xsl:when test="$input2/*[name()=name(current())]">
                <xsl:copy-of select="$input2/*"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet> 

Ни один из этих методов работают ... извините, XSLT для меня совсем новичок, поэтому я не уверен, что делаю, и был бы очень признателен за руку, держащую за это.

7
задан Zac 28 July 2011 в 16:39
поделиться