Преобразование полей XML в пары ключ / значение - PullRequest
0 голосов
/ 30 апреля 2019

В SAP PI у меня есть XML-файлы от остальных служб (веб-конфигуратор), для которых поля могут различаться в зависимости от продукта.Например, у продукта A есть цвет, высота и ширина, а у продукта B есть цвет, высота, ширина и глубина.

Пример входящего XML:

<?xml version="1.0" encoding="UTF-8"?>
<Order>
    <Products>
        <Product> 
            <Color>Black</Color>
            <Height>2000</Height>
            <Width>1000</Width>
        </Product>
    </Products>
</Order>

Для обработки этого'generic' Я хочу преобразовать поля в некую структуру пары ключ / значение с помощью преобразования XSL 1.0.

Требуемый пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<Order>
    <Products>
        <Product> 
            <Var>
                <VarName>Color</VarName>
                <VarValue>Black</VarValue>
            </Var>
            <Var>
                <VarName>Height</VarName>
                <VarValue>2000</VarValue>
            </Var>
            <Var>
                <VarName>Width</VarName>
                <VarValue>1000</VarValue>
            </Var>
        </Product>
    </Products>
</Order>

Я нашел статью, в которойописывает это наоборот XSLT: преобразовать пару имя / значение и преобразовать XML

Ответы [ 2 ]

1 голос
/ 30 апреля 2019
<xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Products">
        <xsl:copy>
            <xsl:for-each select="Product">
                <Product>
                    <xsl:for-each select="./*">
                        <Var>
                            <VarName><xsl:value-of select="local-name()"/></VarName>
                            <VarValue><xsl:value-of select="."/></VarValue>
                        </Var>
                    </xsl:for-each>
                </Product>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
1 голос
/ 30 апреля 2019

Вот что Мартин сказал тебе:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:template match="Product/*">
    <Var>
      <VarName>
        <xsl:value-of select="name()"/>
      </VarName>
      <VarValue>
        <xsl:value-of select="."/>
      </VarValue>
    </Var>
  </xsl:template>

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

</xsl:stylesheet>
...