Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xml转换为另一个xml_Xml_Transformation - Fatal编程技术网

xml转换为另一个xml

xml转换为另一个xml,xml,transformation,Xml,Transformation,我有一个采用这种格式的大型xml文件 162 烙印 索尼 1. 162 类型 摄像机 1. 162 颜色 黄色的 1. 163 烙印 飞利浦 1. 163 类型 班长 1. .... excel中的表格如下所示: Prod Atr Value Filter 162 Brand Sony 1 162 Type Camera 1 162 Color Yellow 1 163 Brand Philips 1 163 Type Monitor 1 我想将

我有一个采用这种格式的大型xml文件


162
烙印
索尼
1.
162
类型
摄像机
1.
162
颜色
黄色的
1.
163
烙印
飞利浦
1.
163
类型
班长
1.
....
excel中的表格如下所示:

Prod Atr    Value   Filter
162  Brand  Sony    1
162  Type   Camera  1
162  Color  Yellow  1
163  Brand  Philips 1
163  Type   Monitor 1
我想将上述xml转换为xml格式,以便获取此表(排除列筛选器):

还是更好的结果

Prod  Brand   Type   Color
162   Sony    Camera Yellow
163   Philips Monitor 
这个文件有30000行,每个产品都有不同数量的属性。例如,产品162具有3个属性,但产品163具有2个属性。如果可能,我希望转换在excel之外(在linux环境中,如果我设置了cronjob)


提前谢谢

尝试以下XSLT 3.0转换:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        version="3.0" expand-text="yes">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
    <data>
      <xsl:for-each-group select="/data/chars" group-by="prod">
        <chars>
          <xsl:copy-of select="prod"/>
          <xsl:for-each select="current-group()">
            <xsl:element name="{atr}">{value}</xsl:element>
          </xsl:for-each>
       </chars>
     </xsl:for-each-group>
    </data>
</xsl:template>

</xsl:transform>

{value}
结果是:

<?xml version="1.0" encoding="UTF-8"?>
<data>
   <chars>
      <prod>162</prod>
      <Brand>Sony</Brand>
      <Type>Camera</Type>
      <Color>yellow</Color>
   </chars>
   <chars>
      <prod>163</prod>
      <Brand>Philips</Brand>
      <Type>Monitor</Type>
   </chars>
</data>

162
索尼
摄像机
黄色的
163
飞利浦
班长
当导入Excel时,它有望提供您想要的内容。看看它在哪里起作用


(我必须更正您的数据,使之成为格式良好的XML)

我想到了带有Xmlstarlet的bash!非常感谢迈克尔·凯先生。但现在我看到在我的文件中有许多包含特殊字符的属性,例如机器类型(之间的空格)。所以,若我们转换为一个元素,那个么这个过程就会因为错误而停止。如何用xsl替换无效字符?。我看到该文件包含空格、括号和/。再次感谢!!!您可以使用translate()函数替换字符,也可以放弃使用属性名作为元素名的想法,而是生成(比如)
Monitor
。但这可能无法很好地导入Excel。使用此函数解决了问题:{value}。再次感谢你的帮助!!!
<?xml version="1.0" encoding="UTF-8"?>
<data>
   <chars>
      <prod>162</prod>
      <Brand>Sony</Brand>
      <Type>Camera</Type>
      <Color>yellow</Color>
   </chars>
   <chars>
      <prod>163</prod>
      <Brand>Philips</Brand>
      <Type>Monitor</Type>
   </chars>
</data>