Как перевести плоскую структуру XML в иерархический XML с помощью XSLT 1.0?

xslt xpath xslt-1.0 xpath-1.0

11 просмотра

1 ответ

Начиная с образцовой, неуправляемой форматированной XML-структуры:

<list>
    <topic>
        <title>
            Paragraph 1
        </title>
    </topic>
    <topic>
        <main>
            Content 1
        </main>
    </topic>
    <topic>
        <main>
            Content 2
        </main>
    </topic>
    <!-- ... -->
    <topic>
        <main>
            Content n
        </main>
    </topic>
    <topic>
        <title>
            Paragraph 2
        </title>
    </topic>
    <topic>
        <main>
            Content 1
        </main>
    </topic>
    <!-- ... -->
    <topic>
        <main>
            Content n
        </main>
    </topic>
</list>

Содержание «title» и «main» - это просто заполнители. Содержимое «title» отличается в каждом узле. Содержание «основного» может варьироваться или не меняться. Количество «основных» элементов неопределенно.

Цель состоит в том, чтобы суммировать тему / основные элементы, следующие за типом / заголовком, следующим образом:

<list>
    <paragraph name="1">
        <item>Content 1</item>
        <item>Content 2</item>
        <item>Content n</item>
    </paragraph>
    <paragraph name="1">
        <item>Content 1</item>
        <item>Content n</item>
    </paragraph>
</list>

Граничным условием является ограничение на версию 1 xslt и xpath.

Ранее этот вопрос задавали в аналогичной форме. Я не нашел удовлетворительного ответа.

Автор: Denis Giffeler Источник Размещён: 17.05.2019 03:40

Ответы (1)


0 плюса

В основном, вы ищете реализацию XSLT 1.0 group-starting-with. Это можно сделать следующим образом:

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:strip-space elements="*"/>

<xsl:key name="topic-by-leader" match="topic[main]" use="generate-id(preceding-sibling::topic[title][1])" />

<xsl:template match="/list">
    <xsl:copy>
        <xsl:for-each select="topic[title]">
            <paragraph name="{position()}">
                <xsl:for-each select="key('topic-by-leader', generate-id())" >
                    <item>
                        <xsl:value-of select="normalize-space(main)" />
                    </item>
                </xsl:for-each>
            </paragraph>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
Автор: michael.hor257k Размещён: 16.11.2018 07:00
Вопросы из категории :
32x32