XSLTv2.0,xsl:使用正则表达式而不是子字符串进行排序?

XSLTv2.0,xsl:使用正则表达式而不是子字符串进行排序?,xslt,Xslt,我试图使用XSLT2.0对包含不规则内容的XML文件中的字符串进行排序 列表应根据“Rep.”后面的数字排序,然后根据“Nr.”后面的数字排序,其他所有内容都可以忽略(标题、Bd等) 以下是XML中字符串的一些示例: <a>I. HA Rep. 90, Nr. 45203</a> <a>Rep. 89 Nr. 17750</a> <a>I. HA Rep. 77, Tit. 500 Nr. 42 Bd. 5</a> <

我试图使用XSLT2.0对包含不规则内容的XML文件中的字符串进行排序

列表应根据“Rep.”后面的数字排序,然后根据“Nr.”后面的数字排序,其他所有内容都可以忽略(标题、Bd等)

以下是XML中字符串的一些示例:

<a>I. HA Rep. 90, Nr. 45203</a>
<a>Rep. 89 Nr. 17750</a>
<a>I. HA Rep. 77, Tit. 500 Nr. 42 Bd. 5</a>
<a>I. HA Rep. 77, Tit. 500 Nr. 43 Adhibendum</a>
<a>I. HA Rep. 77 Tit. 343a Nr. 142 Bd. 7</a>
<a>I. HA Rep. 97 Nr. 5285</a>
I.HA Rep.90,编号45203
代表89第17750号
I.HA代表77,Tit。500编号42 Bd.5
I.HA代表77,Tit。500件43号阿迪本杜姆
I.HA代表77 Tit。343a编号142 Bd.7
一、医管局代表第97号第5285号
列表应如下所示:

<a>I. HA Rep. 77, Tit. 500 Nr. 42 Bd. 5</a>
<a>I. HA Rep. 77, Tit. 500 Nr. 43 Adhibendum</a>
<a>I. HA Rep. 77 Tit. 343a Nr. 142 Bd. 7</a>
<a>Rep. 89 Nr. 17750</a>
<a>I. HA Rep. 90, Nr. 45203</a>
<a>I. HA Rep. 97 Nr. 5285</a>
I.HA代表77,Tit。500编号42 Bd.5
I.HA代表77,Tit。500件43号阿迪本杜姆
I.HA代表77 Tit。343a编号142 Bd.7
代表89第17750号
一、医管局代表第90号,第45203号
一、医管局代表第97号第5285号
我用XSLT写了这个:

<xsl:sort select="concat(format-number(number(substring-before(substring-after(a, 'Rep. '),', Nr.')),'000'),format-number(number(substring-after(a, 'Nr. ')),'0000000000'))" data-type="number" />' 
'
这是可行的,但只适用于最常见的情况(列表中的第一种)。我有将近1000个这样的字符串,所以我需要正则表达式,但我不知道如何使用fn:replace、fn:matches或fn:tokenize进行这种排序。我都试过了。fn:match只给出true或false,fn:replace只允许在第二个参数中使用xpath(我在第三个参数中需要它),可能使用fn:tokenize


我在这个简单的问题上花了几个小时,非常感谢为这个新手提供的任何提示。

下面是一个使用两个
xsl:sort
和嵌套
xsl:analyze string
的示例:

<xsl:template match="root">
    <xsl:copy>
        <xsl:perform-sort select="a">
            <xsl:sort>
                <xsl:analyze-string select="." regex="Rep\.\s*([0-9]+)">
                    <xsl:matching-substring>
                        <xsl:sequence select="xs:decimal(regex-group(1))"/>
                    </xsl:matching-substring>
                </xsl:analyze-string>
            </xsl:sort>
            <xsl:sort>
                <xsl:analyze-string select="." regex="Nr\.\s*([0-9]+)">
                    <xsl:matching-substring>
                        <xsl:sequence select="xs:decimal(regex-group(1))"/>
                    </xsl:matching-substring>
                </xsl:analyze-string>
            </xsl:sort>
        </xsl:perform-sort>
    </xsl:copy>
</xsl:template>

下面是一个使用两个
xsl:sort
和嵌套
xsl:analyze字符串的示例:

<xsl:template match="root">
    <xsl:copy>
        <xsl:perform-sort select="a">
            <xsl:sort>
                <xsl:analyze-string select="." regex="Rep\.\s*([0-9]+)">
                    <xsl:matching-substring>
                        <xsl:sequence select="xs:decimal(regex-group(1))"/>
                    </xsl:matching-substring>
                </xsl:analyze-string>
            </xsl:sort>
            <xsl:sort>
                <xsl:analyze-string select="." regex="Nr\.\s*([0-9]+)">
                    <xsl:matching-substring>
                        <xsl:sequence select="xs:decimal(regex-group(1))"/>
                    </xsl:matching-substring>
                </xsl:analyze-string>
            </xsl:sort>
        </xsl:perform-sort>
    </xsl:copy>
</xsl:template>

那么:

<xsl:sort select="replace(., '(.*Rep\.\s)(\d+)(.*)', '$2')" data-type="number" order="ascending"/>
<xsl:sort select="replace(., '(.*Nr\.\s)(\d+)(.*)', '$2')" data-type="number" order="ascending"/>

那么:

<xsl:sort select="replace(., '(.*Rep\.\s)(\d+)(.*)', '$2')" data-type="number" order="ascending"/>
<xsl:sort select="replace(., '(.*Nr\.\s)(\d+)(.*)', '$2')" data-type="number" order="ascending"/>


您可以使用
xsl:function
在用户定义函数中使用
xsl:analyze string
来提取数字。您甚至不需要该函数,XSLT 2.0还允许您将
xsl:analyze string
作为
xsl:sort
的子项。您可以在用户定义的函数中使用
xsl:analyze string
来提取数字。您甚至不需要该函数,XSLT2.0还允许您将
xsl:analyze字符串
作为
xsl:sort
的子项。嘿,我不知道您可以引用fn:replace的第三个参数中的第二个参数。我一直试图用一两句话来解决这个问题,但已经放弃了。你证明了这是可能的!!!嘿,我不知道你可以引用fn的第三个参数中的第二个参数:replace。我一直试图用一两句话来解决这个问题,但已经放弃了。你证明了这是可能的!!!