Как отсортировать теги XML с помощью xslt - PullRequest
0 голосов
/ 08 мая 2019

Я новичок в переполнении стека, даже если я часто использую его долгое время.

Я пытаюсь отсортировать некоторые теги в XML-файл, используя файл xslt.

Мой файл file.xml:

<?xml version="1.0" encoding="UTF-8"?>
<nots>
    <base_name>
        <label>B_bn</label>
        <functionality>
            <label>B_f2</label>
            <mails>z_user@domain.com</mails>
            <mails>f_user@domain.com</mails>
            <mails>a_user@domain.com</mails>
        </functionality>
        <functionality>
            <label>A_f1</label>
            <mails></mails>
        </functionality>
        <functionality>
            <label>C_f3</label>
            <mails>x_user@domain.com</mails>
            <mails>a_user@domain.com</mails>
        </functionality>
    </base_name>
    <base_name>
        <label>A_bn</label>
        <functionality>
            <label>C_f3</label>
            <mails></mails>
        </functionality>
        <functionality>
            <label>A_f1</label>
            <mails></mails>
        </functionality>
        <functionality>
            <label>B_f2</label>
            <mails></mails>
        </functionality>
    </base_name>
</nots>

Я хотел бы получить на выходе новый файл file.xml, в котором отсортированы теги «base_name», «functions» и «mails».

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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="urn:TestNamespace">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="base_name">
        <xsl:copy>
            <xsl:apply-templates select="label" />
            <xsl:apply-templates select="functionality">
                    <xsl:sort select="label" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="nots">
        <xsl:copy>
            <xsl:apply-templates select="base_name">
                <xsl:sort select="label" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Я могу отсортировать теги "base_name" и "funzionality", но поскольку я новичок в xslt, я не знаю, каксортируйте также теги почты.

Пожалуйста, кто-нибудь может подсказать, как это решить?Заранее спасибо за вашу поддержку!;)

1 Ответ

0 голосов
/ 08 мая 2019

Вам просто нужно добавить следующий шаблон, чтобы отсортировать mails по дочернему текстовому узлу.

<xsl:template match="functionality">
    <xsl:copy>
        <xsl:apply-templates select="label" />
        <xsl:apply-templates select="mails">
                <xsl:sort select="text()" />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>    

Или вы могли бы сделать это ....

<xsl:template match="functionality">
    <xsl:copy>
        <xsl:apply-templates select="label" />
        <xsl:apply-templates select="mails">
                <xsl:sort select="." />
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>    

Здесь . представляет текущий узел (то есть узел mails, выбранный для сортировки). Поскольку ваш mails узел имеет только один текстовый узел, значение текущего узла будет именно таким.

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