Группировка элементов XSLT по значению (XSLT 1.0) - PullRequest
1 голос
/ 21 июня 2020

Мне очень сложно сгруппировать разные элементы по общему значению с помощью XSLT 1.0.

Используя следующее XML:

<root>
    <segment>
        <id>ABCD123</id>
    </segment>
    <segment>
        <contact>
            <field1>ABCD123</field1>
            <field2>(111)345-7890</field2>
        </contact>
    </segment>
    <segment>
        <details>
            <field1>ABCD123</field1>
            <field5>More Details for ABCD123</field5>
        </details>
    </segment>
    <segment>
        <id>XZX098</id>
    </segment>
    <segment>
        <contact>
            <field1>XZX098</field1>
            <field2>(111)443-9999</field2>
        </contact>
    </segment>
    <segment>
        <details>
            <field1>XZX098</field1>
            <field5>More Details for XZX098</field5>
        </details>
    </segment>
</root>

Преобразуйте в это:

<File>
    <Record>
        <id>ABCD123</id>
        <phone>(111)345-7890</phone>
        <details>More Details for ABCD123</details>
    </Record>
    <Record>
        <id>XZX098</id>
        <phone>(111)443-9999</phone>
        <details>More Details for XZX098</details>
    </Record>
</File>

Я пытаюсь сгруппировать записи по идентификатору, а затем получить контактную и подробную информацию, соответствующую этому идентификатору.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 21 июня 2020

Я не вижу никакой группировки как таковой здесь требуется - просто простой поиск данных с перекрестными ссылками:

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:key name="contact-details" match="contact|details" use="field1" />

<xsl:template match="root">
    <File>
        <xsl:for-each select="segment/id">
            <Record>
                <xsl:copy-of select="."/>
                <phone>
                    <xsl:value-of select="key('contact-details', .)/field2"/>
                </phone>
                <details>
                    <xsl:value-of select="key('contact-details', .)/field5"/>
                </details>
            </Record>
        </xsl:for-each>
    </File>
</xsl:template>

</xsl:stylesheet>
...