Внутри значения атрибута каждые {
и }
должны быть удвоены (чтобы отличить их от единичных символов, обозначающих 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
Обновление : как напомнил Майкл Кей, можно избежать необходимости дублировать любые фигурные скобки, если в качестве контекста переменной указано RegEx, а эта переменная упоминается как AVT в regex
атрибут 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>