在xslt中排序不起作用

时间:2016-02-02 08:44:59

标签: sorting xslt

我正在尝试根据字段值person_id_external对xml进行排序。

我使用的代码是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>
<xsl:template match="A/B">
    <xsl:copy>
        <xsl:apply-templates>
           <xsl:sort select="C/person_id_external" order="ascending" />        
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

有效载荷是:

<A>
    <B>
        <C>
            <logon_user_name>10027</logon_user_name>
            <person_id>1100111</person_id>
            <person_id_external>10027</person_id_external>
        </C>
    </B>
    <B>
        <C>
            <logon_user_name>428122</logon_user_name>
            <person_id>11141</person_id>
            <person_id_external>111358</person_id_external>
        </C>
    </B>
    <B>
        <C>
            <logon_user_name>428122</logon_user_name>
            <person_id>100441</person_id>
            <person_id_external>10636</person_id_external>
        </C>
    </B>
</A>

结果提供了输入的副本,但没有排序。

预期结果是:

<A>
    <B>
        <C>
            <logon_user_name>10027</logon_user_name>
            <person_id>1100111</person_id>
            <person_id_external>10027</person_id_external>
        </C>
    </B>
    <B>
        <C>
            <logon_user_name>428122</logon_user_name>
            <person_id>11141</person_id>
            <person_id_external>10636</person_id_external>
        </C>
    </B>
    <B>
        <C>
            <logon_user_name>428122</logon_user_name>
            <person_id>100441</person_id>
            <person_id_external>111358</person_id_external>
        </C>
    </B>
</A>

干杯, Vikcy

2 个答案:

答案 0 :(得分:0)

- 根据您的修改进行编辑 -

在您的示例中,每个B节点只有一个C节点。因此,您必须对B节点进行排序才能获得预期结果 - 您必须从其父A的上下文中执行此操作:

<xsl:template match="A">
    <xsl:copy>
        <xsl:apply-templates>
            <xsl:sort select="C/person_id_external" order="ascending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

请注意,默认排序数据类型为text(即按字母顺序排列)。

答案 1 :(得分:0)

以下代码有效:

<xsl:template match="A">
<xsl:copy>
    <xsl:apply-templates>
        <xsl:sort select="C/person_id_external" data-type="number" order="ascending"/>
    </xsl:apply-templates>
</xsl:copy>

传入的有效负载的类型为数字。

干杯, 维卡斯辛格