Как объединить данные из 2 последовательностей и получить одну отдельную последовательность в XSLT? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть источник XML, подобный этому:

<?xml version="1.0" encoding="utf-8"?>
<records>
    <record>
        <employee>
            <firstname>Tom</firstname>
            <lastname>Hanks</lastname>
        </employee>
        <boss firstname="Sylvester" lastname="Stallone">Sylvester</boss>
    </record>
    <record>
        <employee>
            <firstname>Tom</firstname>
            <lastname>Hanks</lastname>
        </employee>
        <boss firstname="Johnny" lastname="Depp">Johnny</boss>
    </record>
    <record>
        <employee>
            <firstname>Johnny</firstname>
            <lastname>Depp</lastname>
        </employee>
        <boss firstname="Robin" lastname="Williams">Robin</boss>
    </record>
</records>

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

<root>
    <firstname>Tom</firstname>
    <firstname>Sylvester</firstname>
    <firstname>Johnny</firstname>
    <firstname>Robin</firstname>
</root>

Я провел несколько тестов и наконец смог объединить все в одну строку, используя этот XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="/">
        <root>
            <xsl:variable name="all_Users" select="records/record/employee/firstname" />
            <xsl:variable name="all_Values" select="records/record/boss" />

            <xsl:variable name="all_first_names" >
                <xsl:copy-of select="$all_Users"/>
                <xsl:copy-of select="$all_Values"/>
            </xsl:variable>

            <xsl:for-each select="$all_first_names"> 
                <firstname><xsl:value-of select="." /></firstname>
            </xsl:for-each>

        </root>
    </xsl:template>
</xsl:stylesheet>

Вот мой результат:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <firstname>TomTomJohnnySylvesterJohnnyRobin</firstname>
</root>

Есть ли способ слияния последовательности $all_Users и $all_Values в одну последовательность, а не строку?

Большое спасибо заранее.

1 Ответ

1 голос
/ 24 февраля 2020

Почему бы просто:

XSLT 2.0

<xsl:stylesheet version="2.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="/records">
    <root>
        <xsl:for-each select="distinct-values(record/employee/firstname | record/boss/@firstname)">
            <firstname>
                <xsl:value-of select="." />
            </firstname>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

Демо : https://xsltfiddle.liberty-development.net/6rexjij


PS Основная проблема с вашей попыткой (за исключением не выполнения требования отдельного ) заключается в том, что вы делаете:

<xsl:for-each select="$all_first_names">

Существует только один all_first_names переменная. Если вы хотите создать элемент для каждого из его узлов, вам нужно сделать:

<xsl:for-each select="$all_first_names/node()">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...