如何加入两个XML文件匹配的节点 [英] How to join two XML files with a matching node
问题描述
我需要找到一种方法来连接两个XML文件时,他们有一个匹配的节点。从我搜集这可能完成与许多不同的语言...有一个PHP或AJAX的方式做到这一点?从SO其他职位我看到XSLT解决方案..我真的不得到。这是最好的/ preferred方法?如果是这样,知道任何有用的XSLT教程?
I need to find a way to join two XML files when they have a matching node. From what I gather this could be accomplished with many different languages... is there a PHP or an AJAX way to do this? From other posts on SO I see XSLT solutions.. that I dont really get. Is this the best/preferred method? If so, know of any helpful XSLT tutorials?
例如XML-1是这样的:
For example XML-1 is like :
<FOO>
</A>
</B>
</C>
</D>
</FOO>
和XML-2:
<FOO>
</B>
</E>
</FOO>
什么是检查其中&LT的最佳方法; B&GT; ==&LT; B&GT;
然后添加&LT; E&GT;
嗯,我不能让这与我的假设的例子来工作,我想我会以我目前真的这样做,看看是否有人能帮助我这个更新。我试图从下面我发现对SO,没有运气的方法等。
Well I cant get this to work with my hypothetical example and thought I would update with what I am really doing to see if anyone can help me figure this. I have tried the methods from below and others I have found on SO with no luck.
真正的模式是这样的:
file1.xml
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
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这些节点如下:
What I need to figure out is to have a new XML file generated that would merge these nodes with identical SYTLE_COLOR and look like:
<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,看起来像:
I tried creating a merge.xsl that looks like :
<?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>
我也试过这样的合并:
I also tried a merge like this:
<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是很新的给我,让我不知道我在做什么,并能真正AP preciate一些手拿着这一点。
Neither of these methods are working.. sorry XSLT is very new to me so I am not sure what I am doing and would really appreciate some hand holding on this one.
推荐答案
这是原来的转换略作修改,以适应新的要求。合并是通过检查的 file2.xml 的元素进行。当前项目中的文件1 的中的文件2 的儿童项目将被合并的仅如果没有present在文件1 。
This is the original transform slightly modified to adapt the new requirements. The merge is performed by checking against file2.xml elements. For the current ITEM in file1, a children ITEM in file2 will be merged only if not present in the file1.
[XSLT 1.0]
[XSLT 1.0]
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="input2" select="document('test_input2.xml')/DATA"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ITEM">
<xsl:variable name="item" select="
$input2/ITEM[STYLE_COLOR=current()/STYLE_COLOR]"/>
<xsl:variable name="ITEM" select="."/>
<xsl:if test="$item">
<xsl:copy>
<xsl:for-each select="$item/*">
<xsl:if test="count($ITEM/*[name()=name(current())])=0">
<xsl:copy-of select="." />
</xsl:if>
</xsl:for-each>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
适用于本 input1.xml
:
<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>
<ITEM>
<PRODUCT_TYPE>simple</PRODUCT_TYPE>
<STYLE_COLOR>1524740008</STYLE_COLOR>
<SHORT_DESCRIPTION>Black Shoe</SHORT_DESCRIPTION>
<CLASS_NAME>FOOTWEAR</CLASS_NAME>
<STATUS>Disabled</STATUS>
</ITEM>
<ITEM>
<PRODUCT_TYPE>simple</PRODUCT_TYPE>
<STYLE_COLOR>777</STYLE_COLOR>
<SHORT_DESCRIPTION>Black Shoe</SHORT_DESCRIPTION>
<CLASS_NAME>FOOTWEAR</CLASS_NAME>
<STATUS>Disabled</STATUS>
</ITEM>
</DATA>
和 input2.xml
合并,产生:
<DATA>
<ITEM>
<STYLE_COLOR>1524740007</STYLE_COLOR>
<NEXT_ARRIVAL>2011-08-05</NEXT_ARRIVAL>
<CLASS_NAME>XXX</CLASS_NAME>
<OTHER>YYY</OTHER>
</ITEM>
<ITEM>
<STYLE_COLOR>1524740008</STYLE_COLOR>
<NEXT_ARRIVAL>2011-08-05</NEXT_ARRIVAL>
</ITEM>
</DATA>
生产:
<DATA>
<ITEM>
<NEXT_ARRIVAL>2011-08-05</NEXT_ARRIVAL>
<OTHER>YYY</OTHER>
<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>
<ITEM>
<NEXT_ARRIVAL>2011-08-05</NEXT_ARRIVAL>
<PRODUCT_TYPE>simple</PRODUCT_TYPE>
<STYLE_COLOR>1524740008</STYLE_COLOR>
<SHORT_DESCRIPTION>Black Shoe</SHORT_DESCRIPTION>
<CLASS_NAME>FOOTWEAR</CLASS_NAME>
<STATUS>Disabled</STATUS>
</ITEM>
</DATA>
请注意:
- 变换的不的覆盖现有元素对于给定的项目,只复制缺少的
- 在项目
input1.xml
复制输出只有在input2.xml
李匹配>
- the transform does not override existing elements for a given ITEM, just copy the missing ones
- ITEM in
input1.xml
is copied in output only if has a match ininput2.xml
这篇关于如何加入两个XML文件匹配的节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!