Regex XSLT+;正则表达式替换

Regex XSLT+;正则表达式替换,regex,xml,xslt,Regex,Xml,Xslt,我有这样一个XML片段: ... <housenumber>23</housenumber> ... <housenumber>453a</housenumber> ... <housenumber>76-79</housenumber> ... <housenumber>12 foo bar something 43</housenumber> ... ... <housenumber>

我有这样一个XML片段:

...
<housenumber>23</housenumber>
...
<housenumber>453a</housenumber>
...
<housenumber>76-79</housenumber>
...
<housenumber>12 foo bar something 43</housenumber>
...
...
<housenumber>23</housenumber>
<!-- v1 = 23, v2 = null -->
...
<housenumber>453a</housenumber>
<!-- v1 = 453, v2 = a -->
...
<housenumber>76-79</housenumber>
<!-- v1 = 76, v2 = -79 -->
...
<housenumber>12 foo bar something 43</housenumber>
<!-- v1 = 12, v2 = foo bar something 43 -->
...
。。。
23
...
453a
...
76-79
...
12富吧43
...
如何使用XSLT将这些门牌号分成两部分,以便得到两个变量——第一个包含“从位置1到第一次出现非数字字符的所有内容”,第二个包含“其他所有内容”

比如说:

...
<housenumber>23</housenumber>
...
<housenumber>453a</housenumber>
...
<housenumber>76-79</housenumber>
...
<housenumber>12 foo bar something 43</housenumber>
...
...
<housenumber>23</housenumber>
<!-- v1 = 23, v2 = null -->
...
<housenumber>453a</housenumber>
<!-- v1 = 453, v2 = a -->
...
<housenumber>76-79</housenumber>
<!-- v1 = 76, v2 = -79 -->
...
<housenumber>12 foo bar something 43</housenumber>
<!-- v1 = 12, v2 = foo bar something 43 -->
...
。。。
23
...
453a
...
76-79
...
12富吧43
...
有什么提示/想法吗


谢谢。

正如已经在评论中指出的,
分析字符串
会有所帮助,下面是一个使用XSLT 3.0(由Saxon 9.7或Exselt支持)的示例,它使用XPath 3.0函数
分析字符串
()


正则表达式匹配需要XSLT2.0。在您的情况下,
analyze string
可能适合您。您需要说明您是否可以使用XSLT 2.0,或者您是否一直使用XSLT 1.0。@MichaelKay:目前正在检查这个。。。请待命:-)好的,该死的。。。现在(xsltproc)不幸的是XSLT1.0。但我会检查一下,是否可以得到一个与XSLT2.0兼容的库
<integers>23,453,76,12</integers><strings>,a,-79, foo bar something 43</strings>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="root">
        <xsl:variable name="matches" as="element(match)*">
            <xsl:apply-templates select="housenumber"/>
        </xsl:variable>
        <xsl:variable name="v1" select="$matches//group[@nr = 1]/xs:integer(.)"/>
        <xsl:variable name="v2" select="$matches//group[@nr = 2]/string()"/>
        <integers>
            <xsl:value-of select="$v1" separator=","/>
        </integers>
        <strings>
            <xsl:value-of select="$v2" separator=","/>
        </strings>
    </xsl:template>

    <xsl:template match="housenumber">
        <xsl:analyze-string select="." regex="(^[0-9]+)([^0-9]?.*)">
            <xsl:matching-substring>
                <match>
                    <group nr="1">
                        <xsl:value-of select="regex-group(1)"/>
                    </group>
                    <group nr="2">
                        <xsl:value-of select="regex-group(2)"/>
                    </group>
                </match>
            </xsl:matching-substring>
        </xsl:analyze-string>
    </xsl:template>

</xsl:stylesheet>