2011-04-25 54 views
1

我有一個XSL文件,它就像一個魅力,至少,直到我想用從EXSLT正則表達式,我所做的: 補充說:EXSLT和xsltproc的得到一個錯誤

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/

感謝指令,

+0

聽起來像是你的處理器不支持(即延長或一部分)延伸。 – 2011-04-25 19:23:17

+0

'xsltproc --dumpextensions'的輸出不包括正則表達式(使用libxml 20706,libxslt 10126,libexslt 815)。 – mzjn 2011-04-25 19:39:03

+0

您正在使用哪種XSLT處理器? – LarsH 2011-04-25 19:52:49

回答

2

如果您需要EXSLT正則表達式的功能,你必須使用用python編寫的4Suite。 撒克遜不知道這個擴展,但它是XSLT 2.0處理器,所以你可以使用fn:matches而不是regexp:test。請參閱​​。

另一種方法是定義您自己的擴展功能。

在撒克遜:

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

Xalan中:

<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