2012-01-27 1 views
1

Я пытаюсь написать функцию, которая получает доменное имя из текста URL в XML-файле i.e www.example.com.xsl: matching-substring всегда возвращает «false»

<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. Я не уверен, что мне не хватает в этом.

ответ

1

Внутри значения атрибута каждого { и } должны быть удвоены (для того, чтобы отличить их от одиночных символов, которые обозначают АВТ Просто удвоение фигурных скобок:.

^(.*)://([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-stringregex:

<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> 
+1

Правильный ответ. Если удвоение завитушек становится болью, добавление регулярного выражения в переменную может помочь (используйте 'regex =" {$ regex} "') –

+0

@MichaelKay: Да, и еще одно преимущество puttiong регулярного выражения в переменной состоит в том, что тогда regex может быть представлен в частях на разных строках (в разных текстовых узлах), каждый из которых предшествует комментарию - что-то наиболее часто необходимо, чем нет в случае записи и понимания RegExes. –

+0

Кстати, что такое AVT? – MSW

Смежные вопросы