Как добавить новые элементы на основе значений атрибутов с помощью xslt - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу использовать xslt для преобразования этого xml входа,

 <node1 name="n1">
    <node2 name="n2_X1" transform="keep_me"/>
    <node2 name="n2_X2" transform="change_key1"/>
    <node2 name="n2_X3" transform="change_key2"/>
    <node2 name="n2_X4" transform="keep_me"/>
 </node1>

в вывод xml, который выглядит следующим образом,

<node1 name="n1">
    <node2 name="n2_X1" transform="keep_me"/>
    <node2 name="n2_X2" transform="change_key1"/>
    <node2 name="n2_X3" transform="change_key2"/>
    <node2 name="n2_X4" transform="keep_me"/>
    <node3 type="join_tables">
        <node4 name="new_name1_corresponding_to_change_key1"/>
        <node4 name="new_name2_corresponding_to_change_key2"/>
    </node3>
</node1>

В основном, если мойxlst код видит transform="change_key1", я хочу создать новый узел с именем node3 (если еще не создан), добавить атрибут type="join_tables", затем создать новый узел node4 и добавить атрибут name="new_name1_corresponding_to_change_key1".

Я могу использовать xslt для изменения существующих значений атрибутов, но с трудом добавляю node3 и node4.

1 Ответ

0 голосов
/ 11 декабря 2018

Кажется довольно тривиальным:

XSLT 1.0

<xsl:stylesheet version="1.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="node1">
    <xsl:copy>
        <xsl:copy-of select="@*|*"/>
        <xsl:variable name="join_tables" select="node2[starts-with(@transform, 'change_key')]" />
        <xsl:if test="$join_tables">
            <node3 type="join_tables">
                <xsl:for-each select="$join_tables">
                    <node4 name="new_name{position()}_corresponding_to_{@transform}"/>
                </xsl:for-each>
            </node3>
        </xsl:if>
    </xsl:copy>
</xsl:template>

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