在属性值内{
,}
必须加倍(为了将它们与表示 AVT 的单个字符区分开来。只需加倍花括号:
^(.*)://([a-zA-Z0-9\-\.]?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{{2,3}}(/\S*)?)(/.*)$
有了这个更正,当这样调用时:
fdd:get-domain('http://www.abc/cpm/page.aspx')
结果是:
http
我猜你真的想得到domain,因为这个修改过的代码(正则表达式和正则表达式组索引):
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fdd="some:fdd">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:sequence select="fdd:get-domain('http://www.abc.com/cpm/page.aspx')"/>
</xsl:template>
<xsl:function name="fdd:get-domain">
<xsl:param name="url"/>
<xsl:analyze-string select="$url" regex=
"^(.*)://([a-zA-Z0-9\-\.]?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{{2,3}})(/\S*)?(/.*)$">
<xsl:matching-substring>
<xsl:value-of select="regex-group(2)"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="false()"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:function>
</xsl:stylesheet>
当将此转换应用于任何 XML 文档(未使用)时,将产生所需的正确结果:
www.abc.com
更新regex
:正如 Michael Kay 所提醒的,如果将 RegEx 指定为变量的上下文并且该变量在以下属性中被引用为 AVT,则可以避免复制任何花括号xsl:analyze-string
:
<xsl:analyze-string select="$url" regex="{$vRegEx}"
flags="mx" >
这还有另一个好处——我们可以在不同的行上拆分 RegEx 子表达式,甚至将它们与注释混合。
这是重构的转换:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fdd="some:fdd">
<xsl:output method="text"/>
<xsl:variable name="vRegEx">
^(.*) <!-- The scheme -->
://
([a-zA-Z0-9\-\.]?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}) <!-- The domain -->
(/\S*)?(/.*)$ <!-- the path and query string -->
</xsl:variable>
<xsl:template match="/">
<xsl:sequence select="fdd:get-domain('http://www.abc.com/cpm/page.aspx')"/>
</xsl:template>
<xsl:function name="fdd:get-domain">
<xsl:param name="url"/>
<xsl:analyze-string select="$url" regex="{$vRegEx}"
flags="mx" >
<xsl:matching-substring>
<xsl:value-of select="regex-group(2)"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="false()"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:function>
</xsl:stylesheet>