如何对XSLT中每个组的数据编号进行排序

如何对XSLT中每个组的数据编号进行排序,xslt,xslt-2.0,Xslt,Xslt 2.0,如何使用xsl:for each对数据编号进行排序? 输入XML <root> <p content-type="Sta_index2"><bold>6000&#x2013;6243</bold></p> <p content-type="Sta_index2"><bold>5000&#x2013;5158</bold></p> <p con

如何使用xsl:for each对数据编号进行排序?
输入XML

 <root>
    <p content-type="Sta_index2"><bold>6000&#x2013;6243</bold></p>
    <p content-type="Sta_index2"><bold>5000&#x2013;5158</bold></p>
    <p content-type="Sta_index2"><bold>6068(e)</bold></p>
    <p content-type="Sta_index2"><bold>6148</bold></p>
    <p content-type="Sta_index2"><bold>6200&#x2013;6206</bold></p>
    <p content-type="Sta_index2"><bold>6203(b)</bold></p>
    <p content-type="Sta_index2"><bold>480</bold></p>
    <p content-type="Sta_index2"><bold>6500</bold></p>
    <p content-type="Sta_index2"><bold>6450</bold></p>
    <p content-type="Sta_index2"><bold>6500&#x2013;6592</bold></p>
    <p content-type="Sta_index2"><bold>6501(f)(1)</bold></p>
    <p content-type="Sta_index2"><bold>6533.5</bold></p>
    <p content-type="Sta_index2"><bold>10018.15</bold></p>
    <p content-type="Sta_index2"><bold>10018.14</bold></p>
</root>

6000–;6243

5000–;5158

6068(e)

6148

6200;6206

6203(b)

480

6500

6450

6500–;6592

6501(f)(1)

6533.5

10018.15

10018.14

XSLT

<xsl:template match="root">
    <xsl:copy>
        <xsl:for-each select="p">
            <xsl:sort select="number(bold)" data-type="number" order="ascending"/>
            <xsl:text>&#x0A;</xsl:text>
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>    
        </xsl:for-each>
    </xsl:copy>
</xsl:template>
预期产出

    <root>
    <p content-type="Sta_index2"><bold>480</bold></p>
    <p content-type="Sta_index2"><bold>5000&#x2013;5158</bold></p>
    <p content-type="Sta_index2"><bold>6000&#x2013;6243</bold></p>
    <p content-type="Sta_index2"><bold>6068(e)</bold></p>
    <p content-type="Sta_index2"><bold>6148</bold></p>
    <p content-type="Sta_index2"><bold>6200&#x2013;6206</bold></p>
    <p content-type="Sta_index2"><bold>6203(b)</bold></p>
    <p content-type="Sta_index2"><bold>6450</bold></p>
    <p content-type="Sta_index2"><bold>6500</bold></p>
    <p content-type="Sta_index2"><bold>6500&#x2013;6592</bold></p>
    <p content-type="Sta_index2"><bold>6501(f)(1)</bold></p>
    <p content-type="Sta_index2"><bold>6533.5</bold></p>
    <p content-type="Sta_index2"><bold>10018.14</bold></p>
    <p content-type="Sta_index2"><bold>10018.15</bold></p>
</root>

480

5000–;5158

6000–;6243

6068(e)

6148

6200;6206

6203(b)

6450

6500

6500–;6592

6501(f)(1)

6533.5

10018.14

10018.15


代码:

正如塞巴斯蒂安在评论中指出的那样,您可以尝试去除小数点后的任何内容,以用于排序:

<xsl:template match="root">
    <xsl:copy>
        <xsl:perform-sort select="p">
            <xsl:sort select="bold => replace('[^0-9.].*$', '') => xs:decimal()"/>
        </xsl:perform-sort>
    </xsl:copy>
</xsl:template>


正如塞巴斯蒂安在评论中指出的那样,您可以尝试去除小数点后的任何内容,以用于排序:

<xsl:template match="root">
    <xsl:copy>
        <xsl:perform-sort select="p">
            <xsl:sort select="bold => replace('[^0-9.].*$', '') => xs:decimal()"/>
        </xsl:perform-sort>
    </xsl:copy>
</xsl:template>


您需要修改字符串以仅保留您希望应用排序的数字部分。您需要修改字符串以仅保留您希望应用排序的数字部分。谢谢@Martin Sir!谢谢@Martin先生!