我正在尝试编写一个函数,该函数从XML文件中的URL文本获取域名,即www.example.com。
<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(1)"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="false()"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:function>
此函数始终返回false
。我不确定我错过了什么。
答案 0 :(得分:1)
在属性值中,每个{
和}
必须加倍(为了将它们与表示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
我想你真的想要获得域,因为这个修改后的代码(正则表达式和正则表达式组索引)都可以:
<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
更新:正如Michael Kay所提醒的,如果将RegEx指定为变量的上下文并且此变量在{中被引用为AVT,则可以避免复制任何花括号的需要。 {1}} regex
的属性:
xsl:analyze-string
这有另一个好处 - 我们可以在不同的行上拆分RegEx子表达式,甚至可以将它们与注释混合。
以下是重构转换:
<xsl:analyze-string select="$url" regex="{$vRegEx}"
flags="mx" >