【问题标题】:xml transform into another xmlxml转换成另一个xml
【发布时间】:2020-01-07 21:32:35
【问题描述】:

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

<data>
<chars>
<prod>162</prod>
<atr>Brand</atr>
<value>Sony</value>
<filter>1</filter>
</chars>
<chars>
<prod>162</prod>
<atr>Type</atr>
<value>Camera</value>
<filter>1</filter>
</chars>
<chars>
<prod>162</prod>
<atr>Color</atr>
<value>yellow</value>
<filter>1</filter>
</chars>
<prod>163</prod>
<atr>Brand</atr>
<value>Philips</value>
<filter>1</filter>
</chars>
<chars>
<prod>163</prod>
<atr>Type</atr>
<value>Monitor</value>
<filter>1</filter>
</chars>
....
</data>

在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  Atr1   Value1   Atr2  Value2   Atr3   Value3
162   Brand  Sony     Type  Camera   Color  Yellow
163   Brand  Philips  Type  Monitor        

或更好的结果

Prod  Brand   Type   Color
162   Sony    Camera Yellow
163   Philips Monitor 

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

提前致谢!

【问题讨论】:

  • 我想到了 bash 和 Xmlstarlet!

标签: xml transformation


【解决方案1】:

试试这个 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>

结果是:

<?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>

它有望在导入 Excel 时提供您想要的东西。在

上查看它的实际应用

https://xsltfiddle.liberty-development.net/3NSTbeF

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

【讨论】:

  • 非常感谢先生。迈克尔·凯。但是现在我看到在我的文件中我有许多包含特殊字符的属性,例如。机器类型(之间的空格)。因此,如果我们转换为一个元素,那么过程将因错误而停止。如何用 xsl 替换无效字符?我看到该文件包含空格、括号和/。再次感谢!!!
  • 您可以使用 translate() 函数替换字符,或者您可以放弃使用属性名称作为元素名称的想法,而是生成(比如)&lt;property name="type of machine"&gt;Monitor&lt;/property&gt;。但这可能无法很好地导入 Excel。
  • 用这个函数解决的问题:{value }元素>。再次感谢您的帮助!!!
猜你喜欢
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
相关资源
最近更新 更多