EXSLT и xsltproc получают ошибку - PullRequest
1 голос
/ 25 апреля 2011

У меня есть 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/

Спасибо

1 Ответ

2 голосов
/ 23 августа 2011

Если вам нужны функции регулярного выражения EXSLT, вы должны использовать 4Suite, написанный на python.Саксон не знает этого расширения, но это процессор XSLT 2.0, поэтому вы можете использовать fn: match вместо 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

...