好的,这个一直把我推上了墙......
我有一个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上运行它,其中将以下值传递给函数:
...将输出'失败'!
我认为我在这里有一些误解......
答案 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中。