php – 如何使用匹配的节点连接两个XML文件
发布时间:2020-12-13 17:52:37 所属栏目:PHP教程 来源:网络整理
导读:我需要找到一种方法来连接两个 XML文件,当它们具有匹配的节点时.从我收集的内容可以用许多不同的语言来完成……有没有 PHP或AJAX方法来做到这一点?从SO上的其他帖子我看到XSLT解决方案..我真的不知道.这是最好/首选的方法吗?如果是这样,知道任何有用的XSLT
我需要找到一种方法来连接两个
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中不存在时才会合并.
[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才会复制到输出中 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |