Создание динамических вложенных элементов из плоской структуры - PullRequest
0 голосов
/ 31 января 2011

Какой самый элегантный способ создания:

  1. Плоская структура из исходного примера XML
  2. Динамическое создание имен элементов на основе значения в исходном узле

Пример XML:

<block4>
<tag>
    <name>16R</name>
    <value>GENL</value>
</tag>
<tag>
    <name>23G</name>
    <value>REPL</value>
</tag>
<tag>
    <name>16S</name>
    <value>GENL</value>
</tag>
<tag>
    <name>16R</name>
    <value>USECU</value>
</tag>
<tag>
    <name>16R</name>
    <value>FIA</value>
</tag>
<tag>
    <name>94B</name>
    <value>:PLIS//EXCH/XTSE</value>
</tag>
<tag>
    <name>16S</name>
    <value>FIA</value>
</tag>
<tag>
    <name>16S</name>
    <value>USECU</value>
</tag>
<tag>
    <name>16R</name>
    <value>CADETL</value>
</tag>
<tag>
    <name>98A</name>
    <value>:XDTE//20110128</value>
</tag>
<tag>
    <name>16S</name>
    <value>CADETL</value>
</tag>
</block4>

Мой желаемый результат:

<block4>
<GENL>
    <tag>
        <name>23G</name>
        <value>REPL</value>
    </tag>
</GENL>
<USECU>
    <FIA>
        <tag>
            <name>94B</name>
            <value>:PLIS//EXCH/XTSE</value>
        </tag>
    </FIA>
</USECU>
<CADETL>
    <tag>
        <name>98A</name>
        <value>:XDTE//20110128</value>
    </tag>
</CADETL>
</block4>

1 Ответ

1 голос
/ 31 января 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()[1]|@*"/>
        </xsl:copy>
        <xsl:apply-templates select="following-sibling::node()[1]"/>
    </xsl:template>
    <xsl:template match="tag[name='16R']">
        <xsl:element name="{value}">
            <xsl:apply-templates select="following-sibling::node()[1]"/>
        </xsl:element>
        <xsl:apply-templates select="following-sibling::tag
                                        [name='16S']
                                        [value=current()/value]
                                        [1]/following-sibling::node()[1]"/>
    </xsl:template>
    <xsl:template match="tag[name='16S']"/>
</xsl:stylesheet>

Вывод:

<block4>
    <GENL>
        <tag>
            <name>23G</name>
            <value>REPL</value>
        </tag>
    </GENL>
    <USECU>
        <FIA>
            <tag>
                <name>94B</name>
                <value>:PLIS//EXCH/XTSE</value>
            </tag>
        </FIA>
    </USECU>
    <CADETL>
        <tag>
            <name>98A</name>
            <value>:XDTE//20110128</value>
        </tag>
    </CADETL>
</block4>

Примечание : Мелкозернистый обход.

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