【问题标题】:How to sort xml tags using xslt如何使用 xslt 对 xml 标签进行排序
【发布时间】:2019-05-08 08:14:37
【问题描述】:

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

我正在尝试使用 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”、“functionity”和“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”和“功能”进行排序,但是因为我是 xslt 的新手,所以我不知道如何对标签邮件进行排序。

请问,有人能告诉我如何解决吗?提前感谢您的支持! ;)

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2020-09-11
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多