Мне нужно найти способ объединить два XML-файла, когда у них есть соответствующий узел. Из того, что я понял, это можно сделать с помощью множества разных языков ... Есть ли способ сделать это на PHP или AJAX? Из других постов на SO я вижу решения XSLT .. которые я действительно не получаю. Это лучший / предпочтительный метод? Если да, знаете какие-нибудь полезные учебники по XSLT?
Например, XML-1 выглядит так:
<FOO>
</A>
</B>
</C>
</D>
</FOO>
и XML-2:
<FOO>
</B>
</E>
</FOO>
Каков наилучший подход для проверки, где <B>==<B>
затем добавить <E>
Обновление
Ну, я не могу заставить это работать с моим гипотетическим примером и подумал, что обновлю то, что я действительно делаю, чтобы посмотреть, сможет ли кто-нибудь помочь мне понять это. Я попробовал методы из ниже и другие, которые я нашел на 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 очень нов для меня, поэтому я не уверен в том, что делаю, и был бы очень признателен за некоторую руку, держащую этот.