Как отсортировать номера данных для каждой группы в XSLT - PullRequest
0 голосов
/ 28 мая 2020

Как отсортировать номера данных с помощью 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>

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>

КОД: https://xsltfiddle.liberty-development.net/3NSTbfj/29

1 Ответ

2 голосов
/ 29 мая 2020

Как Себастьен указал в комментарии, вы можете попытаться удалить что-либо после десятичных значений, которые вы хотите использовать для сортировки:

<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>

https://xsltfiddle.liberty-development.net/3NSTbfj/30

...