在合并XML项 [英] Merge entries in XML

查看:134
本文介绍了在合并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 =htt​​p://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 =htt​​p://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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆