XSLT:正则表达式函数不起作用?

时间:2010-06-08 12:52:07

标签: regex xslt split

好的,这个一直把我推上了墙......

我有一个xslt函数,它应该根据国家/地区从Zip + City字符串中拆分出Zip代码部分。我无法上班!这是我到目前为止所得到的:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:function name="exslt:GetZip" as="xs:string">
    <xsl:param name="zipandcity" as="xs:string"/>
    <xsl:param name="countrycode" as="xs:string"/>
    <xsl:choose>
        <xsl:when test="$countrycode='DK'">
            <xsl:analyze-string select="$zipandcity" regex="(\d{4}) ([A-Za-zÆØÅæøå]{3,24})">
                <xsl:matching-substring>
                    <xsl:value-of select="regex-group(1)"/>
                </xsl:matching-substring>
                <xsl:non-matching-substring>    
                        <xsl:text>fail</xsl:text>
                </xsl:non-matching-substring> 
            </xsl:analyze-string>               
        </xsl:when>
        <xsl:otherwise>
            <xsl:text>error</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:function>

我在源XML上运行它,其中将以下值传递给函数:

  • zipandcity:“DK-2640KøbenhavnSV”
  • 国家代码:“DK”

...将输出'失败'!

我认为我在这里有一些误解......

3 个答案:

答案 0 :(得分:3)

将regex属性解析为属性值模板whery花括号具有特殊含义。如果这实际上是一个XSL 2.0样式表,则需要通过将它们加倍来转义正则表达式属性中的花括号:(\d{{4}}) ([A-Za-zÆØÅæøå]{{3,24}})

或者你可以定义一个包含你的模式的变量:

<xsl:variable name="pattern">(\d{4}) ([A-Za-zÆØÅæøå]{3,24})</xsl:variable
<xsl:analyze-string select="$zipandcity" regex="{$pattern}">

答案 1 :(得分:3)

除了在XSLT 2.0和大括号必须被转义(但不反斜杠)之前不支持正则表达式的事实之外,还有另外一个原因导致代码不起作用:XSLT正则表达式隐含地锚定在两端。给定字符串DK-2640 København SV,您的正则表达式只匹配2640 København,因此您需要“填充”它以使其使用整个字符串:

regex=".*(\d{{4}}) ([A-Za-zÆØÅæøå]{{3,24}}).*"
在这种情况下,

.*可能就足够了,但有时你必须更加具体。例如,如果\d{4}可以匹配的位置不止一个,则可以在开头使用\D*以确保第一个捕获组与第一组数字匹配。

答案 2 :(得分:2)

正则表达式仅在XSLT 2.x中受支持 - 而不是在XSLT 1.0中。