我需要找到一种方法来连接两个
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对我来说是一个新手,所以我不确定我在做什么,并且非常感谢一些人持有这个.
这是对原始变换稍加修改以适应新要求.通过检查file2.xml元素来执行合并.对于file1中的当前ITEM,file2中的子ITEM只有在file1中不存在时才会合并.
原文链接:https://www.f2er.com/php/133839.html[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>
请注意:
>转换不会覆盖给定ITEM的现有元素,只需复制缺少的元素即可>只有在input2.xml中匹配时,input1.xml中的ITEM才会复制到输出中