CSV в XML преобразования с использованием XSLT - PullRequest
0 голосов
/ 16 апреля 2019

Я не разработчик, но я работаю в сфере технологий и имею базовые знания по xslt.Я был бы очень признателен за помощь в сценарии ниже.Возможно, когда у меня будет пример, я смогу экстраполировать на другие варианты использования.

В csv у меня есть столбцы: Имя Расположение Работа 1 Работа 2 Работа 3

Работа 1 имеет другие атрибуты, такие как время начала, время окончания и оплата Работа 2 имеет смену, бонус Работа 3 имеетsales, ops

пример значений в csv:

Name, Location,Job_Type,Start_time, End_time,Pay, Shift, Bonus,Sales, Ops
john, london,Job_1,800,1900,400, , , , ,
john, london,Job_2, , , ,evening,20000, , , 
john, london,Job_3, , , , , , 200,500

Как сделать так, чтобы эти 3 отдельные строки в csv можно было преобразовать в одну структуру xml:

<name>john</name>
  <location>london</location>
    <Job_1>
      <Start_time>800</Start_time>
      <End_time>1900</End_time>
      <Pay>400</Pay>
    </Job_1>
    <Job_2>
      <Shift>evening</Shift>
      <Bonus>20000</Bonus>
    </Job_2>
    <Job_3>
      <Sales>200</Sales>
      <Ops>500</Ops>
    </Job_3>

Я думал о настройке переменной, которая в первую очередь называется name и location.Тогда сделайте для каждого возможно.Не уверен, как бы я создал оператор, если name это this.name для каждого элемента.

Буду очень признателен за помощь в этом.

1 Ответ

0 голосов
/ 16 апреля 2019

Используя XSLT 3 (как поддерживается программным обеспечением Saxon 9.8 и более поздних версий с открытым исходным кодом и Altova 2017 и более поздними версиями), вы можете разбить входную строку с помощью CSV на последовательность строковых массивов, а затем сгруппировать их по первымЭлемент массива выглядит следующим образом:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:array="http://www.w3.org/2005/xpath-functions/array"
    exclude-result-prefixes="xs array"
    version="3.0">

  <xsl:param name="csv-input" as="xs:string">Name, Location,Job_Type,Start_time, End_time,Pay, Shift, Bonus,Sales, Ops
john, london,Job_1,800,1900,400, , , , ,
john, london,Job_2, , , ,evening,20000, , , 
john, london,Job_3, , , , , , 200,500</xsl:param>

  <xsl:param name="lines" as="xs:string*" select="tokenize($csv-input, '\r?\n')"/>

  <xsl:param name="headers" as="xs:string*" select="tokenize(head($lines), '\s*,\s*')"/>

  <xsl:param name="data" as="array(xs:string)*" select="tail($lines)!array{ tokenize(., '\s*,\s*') }"/>

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/" name="xsl:initial-template" expand-text="yes">
      <root>
          <xsl:for-each-group select="$data" group-by=".(1)">
              <record>
                  <xsl:for-each select="subsequence($headers, 1, 2)">
                      <xsl:element name="{.}">{head(current-group())(position())}</xsl:element>
                  </xsl:for-each>
                  <xsl:for-each select="current-group()">
                      <xsl:element name="{.(3)}">
                          <xsl:variable name="values" select="."/>
                          <xsl:for-each select="(4 to count($headers))">
                              <xsl:if test="normalize-space($values(position() + 3))">
                                <xsl:element name="{$headers[current()]}">{$values(position() + 3)}</xsl:element>
                              </xsl:if>
                          </xsl:for-each>
                      </xsl:element>
                  </xsl:for-each>
              </record>
          </xsl:for-each-group>
      </root>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / 3NJ38Zn / 2

Для автономности примера передаются данные CSVв качестве строкового параметра, но вы, конечно, могли бы вместо этого использовать <xsl:param name="csv-input" as="xs:string" select="unparsed-text('file.csv')"/> для загрузки данных из файла CSV.

Конечно, XSLT 3 на самом деле не является необходимым, с XSLT 2 обычным способом является преобразование CSV.в XML, а затем сгруппировать его по мере необходимости.

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