EXSLT и xsltproc получают ошибку

У меня есть файл XSL, который работает как шарм, по крайней мере, до тех пор, пока я не захотел использовать регулярные выражения из EXSLT, что я сделал: добавил:

  xmlns:regexp="http://exslt.org/regular-expressions"
  extension-element-prefixes="regexp"

и использовал это:

<xsl:choose>
    <xsl:when test="regexp:test(
                       Location/Politic/@Country,
                       'Espa.a',
                       'i'
                    )"
             >ES</xsl:when>
</xsl:choose>

где-то в моем XSL. это приводит к следующей ошибке:

xmlXPathCompOpEval: function test not found
XPath error : Unregistered function
xmlXPathCompiledEval: 3 objects left on the stack.

любая идея, что я делаю неправильно здесь, я строго следовал инструкциям

http://www.exslt.org/

Спасибо,


person snoofkin    schedule 25.04.2011    source источник
comment
Похоже, ваш процессор не поддерживает это расширение (или его часть).   -  person Kevin Peno    schedule 25.04.2011
comment
Вывод из xsltproc --dumpextensions не включает регулярное выражение (с использованием libxml 20706, libxslt 10126, libexslt 815).   -  person mzjn    schedule 25.04.2011
comment
Какой процессор XSLT вы используете?   -  person LarsH    schedule 25.04.2011
comment
xsltproc (команда оболочки Linux)   -  person snoofkin    schedule 26.04.2011
comment
Кстати, я также пробовал: saxonb-xslt, который дает мне эту ошибку: Не удается найти подходящую функцию с тремя аргументами с именем {exslt.org/regular-expressions}test() Преобразование не выполнено: сообщалось об ошибках во время выполнения   -  person snoofkin    schedule 26.04.2011


Ответы (1)


Если вам нужны функции регулярных выражений EXSLT, вы должны использовать 4Suite, написанный на python. Saxon не знает этого расширения, но это процессор XSLT 2.0, поэтому вы можете использовать fn:matches вместо regexp:test. См. http://www.w3.org/TR/xslt20/ .

Другой способ — определить собственную функцию расширения.

На саксонском:

<xsl:stylesheet
    version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:regexp="http://exslt.org/regular-expressions"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    <xsl:function name="regexp:test" as="xs:boolean">
        <xsl:param name="regexp" as="xs:string"/>
        <xsl:param name="str" as="xs:string"/>
        <xsl:sequence select="fn:matches($regexp, $str)"/>
    </xsl:function>

</xsl:stylesheet>

В Халане:

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:regexp="http://exslt.org/regular-expressions"
    xmlns:func="http://exslt.org/functions"
    xmlns:java="http://xml.apache.org/xalan/java"
    extension-element-prefixes="func java regexp"
>

    <func:function name="regexp:test">
        <xsl:param name="regexp"/>
        <xsl:param name="str"/>
        <xsl:variable name="testResult" select="java:matches($regexp, $str)"/>
        <func:result select="$testResult"/>
    </func:function>


</xsl:stylesheet>

http://xml.apache.org/xalan-j/extensions.html

person VSE NN    schedule 23.08.2011