Xslt отдельные значения и динамически добавлять элемент в существующий XML - PullRequest
0 голосов
/ 17 мая 2018

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

<result>
    <data>
        <ID>7705379</ID>
        <value>54</value>
        <country>lv</country>
        <price>24.99</price>
    </data>
    <data>
        <ID>7705379</ID>
        <value>54</value>
        <country>fi</country>
        <price>24.99</price>
    </data>
        <data>
        <ID>7111111</ID>
        <value>503</value>
        <country>fi</country>
        <price>19.99</price>
    </data>
        <data>
        <ID>7111111</ID>
        <value>503</value>
        <country>se</country>
        <price>119.99</price>
    </data>
</result>

во что-то, похожее на это.

 <data>
        <Product>
            <Fields>
                <ID>7705379</ID>
                <ProductST>
                    <Key id="SE" >
                        <Value>54</Value>
                    </Key>
                </ProductST>
                <ProductPrice>
                    <Key id="lv" >
                        <Value>24.99</Value>
                    </Key>
                    <Key id="fi" >
                        <Value>24.99</Value>
                    </Key>
                </ProductPrice>
            </Fields>
        </Product>
        <Product>
            <Fields>
                <ID>7111111</ID>
                <ProductST>
                    <Key id="SE" >
                        <Value>503</Value>
                    </Key>
                </ProductST>
                <ProductPrice>
                    <Key id="fi" >
                        <Value>19.99</Value>
                    </Key>
                    <Key id="se" >
                        <Value>119.99</Value>
                    </Key>
                </ProductPrice>
            </Fields>
        </Product>
    </data>

1 Ответ

0 голосов
/ 18 мая 2018

Исходя из общего входного XML, в общем выходном XML есть некоторые расхождения.Будет трудно перечислить их в комментариях, следовательно, включив их в решение.

  1. Значения, соответствующие элементу <country> из входного XML, не совпадают с несколькими <Key id=""> элементами вывода.
  2. <ProductST> имеет единственный дочерний элемент <Key> в выводе, атрибут которого id имеет значение SE, которого нет во входном XML.
  3. <ProductPrice>имеет правильное количество дочерних <Key> элементов, чьи значения атрибута id соответствуют значениям <country> из входных данных в 3 из 4 экземпляров.

Предполагается, что между данными имеется несоответствиеПри использовании входного XML и выходного XML вы можете попробовать приведенное ниже решение XSLT, которое должно дать достаточно точное представление о группировке значений.Это решение основано на входном XML и, следовательно, не будет соответствовать общему выходному XML.

<xsl:key name="kId" match="data" use="ID" />
<xsl:template match="result">
    <data>
        <xsl:for-each select="data[generate-id() = generate-id(key('kId', ID)[1])]">
            <Product>
                <Fields>
                    <ID><xsl:value-of select="key('kId', ID)/ID" /></ID>
                    <ProductST>
                        <Key>
                            <xsl:attribute name="id">
                                <xsl:value-of select="'SE'" />
                            </xsl:attribute>
                            <Value><xsl:value-of select="key('kId', ID)/value" /></Value>
                        </Key>
                    </ProductST>
                    <ProductPrice>
                        <xsl:for-each select="key('kId', ID)">
                            <Key>
                                <xsl:attribute name="id">
                                    <xsl:value-of select="country" />
                                </xsl:attribute>
                                <Value><xsl:value-of select="price" /></Value>
                            </Key>
                        </xsl:for-each>
                    </ProductPrice>
                </Fields>
            </Product>
        </xsl:for-each>
    </data>
</xsl:template>

Это создает следующий вывод

<data>
    <Product>
        <Fields>
            <ID>7705379</ID>
            <ProductST>
                <Key id="SE">
                    <Value>54</Value>
                </Key>
            </ProductST>
            <ProductPrice>
                <Key id="lv">
                    <Value>24.99</Value>
                </Key>
                <Key id="fi">
                    <Value>24.99</Value>
                </Key>
            </ProductPrice>
        </Fields>
    </Product>
    <Product>
        <Fields>
            <ID>7111111</ID>
            <ProductST>
                <Key id="SE">
                    <Value>503</Value>
                </Key>
            </ProductST>
            <ProductPrice>
                <Key id="fi">
                    <Value>19.99</Value>
                </Key>
                <Key id="se">
                    <Value>119.99</Value>
                </Key>
            </ProductPrice>
        </Fields>
    </Product>
</data>

РЕДАКТИРОВАТЬ: Решение обновлено в соответствии с комментарием.

...