XSLT: функция регулярного выражения не работает? - PullRequest
0 голосов
/ 08 июня 2010

Хорошо, это привело меня к стене ...

У меня есть функция xslt, которая должна отделять часть Zip-кода от строки Zip + City в зависимости от страны.Я не могу заставить его работать!Это то, что я получил до сих пор:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:function name="exslt:GetZip" as="xs:string">
    <xsl:param name="zipandcity" as="xs:string"/>
    <xsl:param name="countrycode" as="xs:string"/>
    <xsl:choose>
        <xsl:when test="$countrycode='DK'">
            <xsl:analyze-string select="$zipandcity" regex="(\d{4}) ([A-Za-zÆØÅæøå]{3,24})">
                <xsl:matching-substring>
                    <xsl:value-of select="regex-group(1)"/>
                </xsl:matching-substring>
                <xsl:non-matching-substring>    
                        <xsl:text>fail</xsl:text>
                </xsl:non-matching-substring> 
            </xsl:analyze-string>               
        </xsl:when>
        <xsl:otherwise>
            <xsl:text>error</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:function>

Я запускаю его на исходном XML, где в функцию передаются следующие значения:

  • zipandcity: "DK-2640København SV "
  • код страны:" DK "

... выведет 'fail'!

Я думаю, что здесь есть кое-что, что я неправильно понимаю ...

Ответы [ 3 ]

3 голосов
/ 09 июня 2010

Атрибут regex анализируется как шаблон значения атрибута, у которого фигурные скобки имеют особое значение. Если это на самом деле таблица стилей XSL 2.0, вам нужно убрать фигурные скобки в атрибуте regex, удвоив их: (\d{{4}}) ([A-Za-zÆØÅæøå]{{3,24}})

В качестве альтернативы вы можете определить переменную, содержащую ваш шаблон:

<xsl:variable name="pattern">(\d{4}) ([A-Za-zÆØÅæøå]{3,24})</xsl:variable
<xsl:analyze-string select="$zipandcity" regex="{$pattern}">
3 голосов
/ 09 июня 2010

Помимо того факта, что регулярные выражения не поддерживаются до тех пор, пока XSLT 2.0 и скобки не должны быть экранированы (а обратная косая черта не работает), есть еще одна причина, по которой этот код не будет работать: регулярные выражения XSLT неявно привязаны на обоих концах,Учитывая строку DK-2640 København SV, ваше регулярное выражение соответствует только 2640 København, поэтому вам нужно «дополнить» его, чтобы заставить его использовать всю строку:

regex=".*(\d{{4}}) ([A-Za-zÆØÅæøå]{{3,24}}).*"

.*, вероятно, достаточно в этом случае,но иногда вам нужно быть более конкретным.Например, если есть более одного места, где \d{4} может соответствовать, вы можете использовать \D* в начале, чтобы убедиться, что первая группа захвата соответствует первой группе цифр.

2 голосов
/ 08 июня 2010

Регулярные выражения поддерживаются только в XSLT 2.x, но не в XSLT 1.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...