在合并XML项 [英] Merge entries in XML
问题描述
我有一个包含产品XML和我需要以某种方式合并为一个条目:
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,00< / code>
< COLOR>黑/黄< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,01< / code>
< COLOR>黑/黄< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,03< / code>
< COLOR>绿/白< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,04< / code>
< COLOR>绿/白< / COLOR>
< / SHOPITEM>
的<产品>
是一样的,是什么改变就是<框架尺寸&GT中,< code取代中,< COLOR方式>
有没有办法从这个得到一个可用的数据?最好是在PHP中,也将是很好的产生,我可以在PHP中处理一个新的XML文件:
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
< FRAMESIZE1> MD< / FRAMESIZE1>
< code1> 029,00< / code1>
<&COLOR1 GT;黑/黄< / COLOR2>
< FRAMESIZE2> LD< / FRAMESIZE2>
< code2> 029,01< / code2>
<&COLOR2 GT;黑/黄< / COLOR2>
< FRAMESIZE3> LD< / FRAMESIZE3>
< code3> 029,03< / code3>
<&COLOR3 GT;绿/白< / COLOR3>
< FRAMESIZE4> MD< / FRAMESIZE4>
< code4> 029,04< / code4>
< COLOR4>绿/白< / COLOR4>
< / SHOPITEM>
我强烈建议你找出一个解决方案,XSLT - 格伦·杰克曼
块引用>我只能说第二次。所以,这里是你的XSLT解决方案。然而,问题是:你有没有显示的再presentative 的XML样本还是有你的真正几种不同的
产品
元素的XML数据?此外,命名元素
code1
,code2
等可以做到的,但我(再次强烈)建议不要这么做。我很高兴在这个细节补充,但如果你的首先澄清真的的需要这个沉重的命名约定,或者如果你可以使用属性来代替:< code N =1/>
XML输入
正如格伦已经提出,必须有一个最外层的元素,让您的输入格式良好的XML。
<根和GT;
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,00< / code>
< COLOR>黑/黄< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,01< / code>
< COLOR>黑/黄< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,03< / code>
< COLOR>绿/白< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,04< / code>
< COLOR>绿/白< / COLOR>
< / SHOPITEM>
< /根>XSLT样式表(1.0)
<?XML版本=1.0编码=UTF-8&GT?;
< XSL:变换的xmlns:XSL =http://www.w3.org/1999/XSL/Transform版本=1.0>
< XSL:输出方法=XML省略的XML声明=是编码=UTF-8缩进=YES/> < XSL:带状空间元素=*/> <的xsl:模板匹配=/根>
< SHOPITEM>
< XSL:复制的选择=SHOPITEM [1] /产品/>
< XSL:选择=SHOPITEM / * [不(个体经营:: PRODUCT)]/&GT复制的;
< / SHOPITEM>
< / XSL:模板>< / XSL:变换>XML输出
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,00< / code>
< COLOR>黑/黄< / COLOR>
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,01< / code>
< COLOR>黑/黄< / COLOR>
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,03< / code>
< COLOR>绿/白< / COLOR>
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,04< / code>
< COLOR>绿/白< / COLOR>
< / SHOPITEM>修改
我错过了太多,有许多不同的元素马蒂亚斯问。
块引用>XML输入
一个比较合理的样本进行检测,与一个以上的
产品
:<根和GT;
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,00< / code>
< COLOR>黑/黄< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,01< / code>
< COLOR>黑/黄< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与gt;其他< /产品与GT;
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,03< / code>
< COLOR>绿/白< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与gt;其他< /产品与GT;
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,04< / code>
< COLOR>绿/白< / COLOR>
< / SHOPITEM>
< /根>样式表
<?XML版本=1.0编码=UTF-8&GT?;
< XSL:变换的xmlns:XSL =http://www.w3.org/1999/XSL/Transform版本=1.0>
< XSL:输出方法=XML省略的XML声明=是编码=UTF-8缩进=YES/> < XSL:带状空间元素=*/> < XSL:关键NAME =督促匹配=SHOPITEM使用=产品/> <的xsl:模板匹配=/根>
< XSL:复制>
<的xsl:for-每个选择=SHOPITEM [生成-ID()=生成-ID(键('PROD',PRODUCT)[1])>
< SHOPITEM>
< XSL:选择=产品/&GT复制的;
< XSL:复制的选择=/根/ SHOPITEM [产品=电流()/产品] / * [不(个体经营:: PRODUCT)]/>
< / SHOPITEM>
< /的xsl:for-每个>
< / XSL:复制>
< / XSL:模板>< / XSL:变换>XML输出
<根和GT;
< SHOPITEM>
<产品与GT;点和LT; /产品与GT;
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,00< / code>
< COLOR>黑/黄< / COLOR>
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,01< / code>
< COLOR>黑/黄< / COLOR>
< / SHOPITEM>
< SHOPITEM>
<产品与gt;其他< /产品与GT;
<&框架尺寸GT; LD< /框架尺寸>
< code> 029,03< / code>
< COLOR>绿/白< / COLOR>
<&框架尺寸GT; MD< /框架尺寸>
< code> 029,04< / code>
< COLOR>绿/白< / COLOR>
< / SHOPITEM>
< /根>I have a XML containing products and I need to somehow merge to one entry:
<SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,00</CODE> <COLOR>black / yellow</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,01</CODE> <COLOR>black / yellow</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,03</CODE> <COLOR>green / white</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,04</CODE> <COLOR>green / white</COLOR> </SHOPITEM>
The
<PRODUCT>
is same, what is change is the<FRAMESIZE>, <CODE>, <COLOR>
.Is there any way to get from this an usable data? The best would be in PHP, but also would be good to generate a new XML file which I can process in PHP:
<SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE1>MD</FRAMESIZE1> <CODE1>029,00</CODE1> <COLOR1>black / yellow</COLOR2> <FRAMESIZE2>LD</FRAMESIZE2> <CODE2>029,01</CODE2> <COLOR2>black / yellow</COLOR2> <FRAMESIZE3>LD</FRAMESIZE3> <CODE3>029,03</CODE3> <COLOR3>green / white</COLOR3> <FRAMESIZE4>MD</FRAMESIZE4> <CODE4>029,04</CODE4> <COLOR4>green / white</COLOR4> </SHOPITEM>
解决方案I strongly recommend you figure out an XSLT solution - glenn jackman
I can only second that. So, here is your XSLT solution. However, the question is: Did you show a representative XML sample or are there several different
PRODUCT
elements in your real XML data?Also, naming elements
CODE1
,CODE2
and so on can be done, but I would (again, strongly) recommend not to do it. I'm glad to add in this detail, but first clarify if you really need this crippling naming convention or if you can use attributes instead:<CODE n="1"/>
XML Input
As suggested by Glenn already, there must be a single outermost element to make your input well-formed XML.
<root> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,00</CODE> <COLOR>black / yellow</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,01</CODE> <COLOR>black / yellow</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,03</CODE> <COLOR>green / white</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,04</CODE> <COLOR>green / white</COLOR> </SHOPITEM> </root>
XSLT Stylesheet (1.0)
<?xml version="1.0" encoding="UTF-8" ?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> <xsl:strip-space elements="*"/> <xsl:template match="/root"> <SHOPITEM> <xsl:copy-of select="SHOPITEM[1]/PRODUCT"/> <xsl:copy-of select="SHOPITEM/*[not(self::PRODUCT)]"/> </SHOPITEM> </xsl:template> </xsl:transform>
XML Output
<SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,00</CODE> <COLOR>black / yellow</COLOR> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,01</CODE> <COLOR>black / yellow</COLOR> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,03</CODE> <COLOR>green / white</COLOR> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,04</CODE> <COLOR>green / white</COLOR> </SHOPITEM>
EDIT:
What I missed too, that there is many different elements as Mathias asked.
XML Input
A more reasonable sample for testing, with more than one
PRODUCT
:<root> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,00</CODE> <COLOR>black / yellow</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,01</CODE> <COLOR>black / yellow</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>OTHER</PRODUCT> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,03</CODE> <COLOR>green / white</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>OTHER</PRODUCT> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,04</CODE> <COLOR>green / white</COLOR> </SHOPITEM> </root>
Stylesheet
<?xml version="1.0" encoding="UTF-8" ?> <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> <xsl:strip-space elements="*"/> <xsl:key name="prod" match="SHOPITEM" use="PRODUCT"/> <xsl:template match="/root"> <xsl:copy> <xsl:for-each select="SHOPITEM[generate-id() = generate-id(key('prod',PRODUCT)[1])]"> <SHOPITEM> <xsl:copy-of select="PRODUCT"/> <xsl:copy-of select="/root/SHOPITEM[PRODUCT = current()/PRODUCT]/*[not(self::PRODUCT)]"/> </SHOPITEM> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:transform>
XML Output
<root> <SHOPITEM> <PRODUCT>POINT</PRODUCT> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,00</CODE> <COLOR>black / yellow</COLOR> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,01</CODE> <COLOR>black / yellow</COLOR> </SHOPITEM> <SHOPITEM> <PRODUCT>OTHER</PRODUCT> <FRAMESIZE>LD</FRAMESIZE> <CODE>029,03</CODE> <COLOR>green / white</COLOR> <FRAMESIZE>MD</FRAMESIZE> <CODE>029,04</CODE> <COLOR>green / white</COLOR> </SHOPITEM> </root>
这篇关于在合并XML项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!