xml превращается в другое xml - PullRequest
0 голосов
/ 08 января 2020

У меня есть большой 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 (в среде linux, если я установил cronjob)

Заранее спасибо!

1 Ответ

0 голосов
/ 08 января 2020

Попробуйте это преобразование 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...