Внутри значения атрибута каждого {
и }
должны быть удвоены (для того, чтобы отличить их от одиночных символов, которые обозначают АВТ Просто удвоение фигурных скобок:.
^(.*)://([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
Update: Как напомнил Майкл Кей, необходимо дублировать любые фигурные скобки можно избежать, если RegEx задается в качестве контекста переменной и эта переменная ссылается как АВТ в атрибуте xsl:analyze-string
regex
:
<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>
Правильный ответ. Если удвоение завитушек становится болью, добавление регулярного выражения в переменную может помочь (используйте 'regex =" {$ regex} "') –
@MichaelKay: Да, и еще одно преимущество puttiong регулярного выражения в переменной состоит в том, что тогда regex может быть представлен в частях на разных строках (в разных текстовых узлах), каждый из которых предшествует комментарию - что-то наиболее часто необходимо, чем нет в случае записи и понимания RegExes. –
Кстати, что такое AVT? – MSW