XSLT - преобразование значения в имя тега и группировка - PullRequest
0 голосов
/ 17 января 2020

Я не уверен, если это возможно, но я хотел бы преобразовать следующее, используя XSLT

Источник

  <?xml version="1.0" encoding="UTF-8"?>
    <Root>
       <MATNR>3006921</MATNR>
       <MAKTX>VANSH,DE,GOLD G.WHITE 6x900ML</MAKTX>
       <VKORG>AT03</VKORG>
       <VKORG>CH05</VKORG>
       <VKORG>DE14</VKORG>
       <PMATN>
          <AttributeName>AT03</AttributeName>
          <AttributeValue>AT-GU4</AttributeValue>
       </PMATN>
       <PMATN>
          <AttributeName>CH05</AttributeName>
          <AttributeValue>CH-I2Z</AttributeValue>
       </PMATN>
       <PMATN>
          <AttributeName>DE14</AttributeName>
          <AttributeValue>DE-B6K</AttributeValue>
       </PMATN>
       <DWERK>
          <AttributeName>AT03</AttributeName>
          <AttributeValue>AT-GU4</AttributeValue>
       </DWERK>
       <DWERK>
          <AttributeName>CH05</AttributeName>
          <AttributeValue>CH-I2Z</AttributeValue>
       </DWERK>
       <DWERK>
          <AttributeName>DE14</AttributeName>
          <AttributeValue>DE-B6K</AttributeValue>
       </DWERK>
       <EAN11>
          <AttributeName>CAR</AttributeName>
          <AttributeValue>04002448087588</AttributeValue>
       </EAN11>
       <EAN11>
          <AttributeName>EA</AttributeName>
          <AttributeValue>4002448077619</AttributeValue>
       </EAN11>
       <VOLUME>
          <AttributeName>CAR</AttributeName>
          <AttributeValue>17460.432</AttributeValue>
       </VOLUME>
       <VOLUME>
          <AttributeName>EA</AttributeName>
          <AttributeValue>2450.448</AttributeValue>
       </VOLUME>
       <VOLUME>
          <AttributeName>UN</AttributeName>
          <AttributeValue>2450.448</AttributeValue>
       </VOLUME>
       <VOLUME>
          <AttributeName>ZST</AttributeName>
          <AttributeValue>0</AttributeValue>
       </VOLUME>
    </Root>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<Root>
   <MATNR>3006921</MATNR>
   <MAKTX>VANSH,DE,GOLD G.WHITE 6x900ML</MAKTX>
   <VKORG>AT03</VKORG>
   <VKORG>CH05</VKORG>
   <VKORG>DE14</VKORG>
   <PMATN>
      <AT03>AT-GU4</AT03>
      <CH05>CH-I2Z</CH05>
      <DE14>DE-B6K</DE14>
      <DE14>DE-B6K</DE14>
   </PMATN>
   <DWERK>
      <AT03>AT-GU4</AT03>
      <CH05>CH-I2Z</CH05>
      <DE14>DE-B6K</DE14>
      <DE14>DE-B6K</DE14>
   </DWERK>
   <EAN11>
      <CAR>04002448087588</CAR>
      <EA>4002448077619</EA>
   </EAN11>
   <VOLUME>
      <CAR>17460.432</CAR>
      <EA>2450.448</EA>
      <UN>2450.448</UN>
      <ZST>0</ZST>
   </VOLUME>
</Root>

Так что для PMATN, DWERK, EAN11, VOLUME я бы хотел, чтобы значение AttributeName стало именем тега, а значение было взято из соответствующего AttributeValue. Все сгруппированы под общей парой тегов.

1 Ответ

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

Шаги группировки и преобразования могут быть выполнены, поскольку

  <xsl:template match="Root">
      <xsl:copy>
          <xsl:apply-templates select="*[not(AttributeName)]"/>
          <xsl:for-each-group select="*[AttributeName]" group-by="node-name()">
              <xsl:copy>
                  <xsl:apply-templates select="current-group()"/>
              </xsl:copy>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="*[AttributeName]">
      <xsl:element name="{AttributeName}">
          <xsl:value-of select="AttributeValue"/>
      </xsl:element>
  </xsl:template>

обрабатывает все остальное с помощью преобразования идентификатора.

https://xsltfiddle.liberty-development.net/gWEaSuU - это XSLT 3, выполняющий это. Для процессора XSLT 2 вам нужно прописать преобразование идентичности вместо использования xsl:mode:

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
...