如何使用xslt对xml标签进行排序

时间:2019-05-08 08:14:37

标签: xml xslt

我是堆栈溢出成员中的新成员,即使很久以来我经常使用它。

我正在尝试使用xslt文件将一些标签分类到xml文件中。

我的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”,“功能”和“邮件”进行了排序。

使用以下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 :(得分:0)

您只需要添加以下模板即可按其子文本节点对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节点只有一个文本节点,因此当前节点的值就是那个。