2014-12-03 6 views
0

EXSLT 라이브러리를 사용하여 XSLT 1.0에 함수를 작성하고 싶습니다. 여기 내 스타일 시트가있다.너무 많은 인수로 함수를 호출했습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:func="http://exslt.org/functions" 
    xmlns:my="http://www.example.com/"> 

    <xsl:output method="text" encoding="UTF-8"/> 

    <func:function name="my:test"> 
     <xsl:param name="param1" /> 
     <xsl:param name="param2" /> 
     <func:result select="concat($param1, $param2)" /> 
    </func:function> 

    <xsl:template match="/"> 
     <xsl:value-of select="my:test('test1', 'test2')" /> 
    </xsl:template> 
</xsl:stylesheet> 

불행하게도 나는 xsltproc 나는 다음과 같은 오류가 발생하고 그것을 실행하려고 할 때.

{ http://www.example.com/ }test: called with too many arguments xmlXPathCompiledEval: 1 objects left on the stack. runtime error: file exslt_function_test.xsl line 16 element value-of XPath evaluation returned no result.

아무런 오류가 보이지 않습니다. 이 함수는 정확히 두 개의 매개 변수로 정의되고 호출됩니다. 과거에 비슷한 문제가있는 사람이 있습니까?

불필요한 주석을 없애려면 ... 아니요, XSLT 2.0을 사용할 수 없습니다.

답변

2

음, 이것은 멋진 퍼즐입니다. <xsl:stylesheet> 요소에 extension-element-prefixes="func"을 포함시키지 않으면 libxslt (xsltproc에서 사용하는 프로세서)가 기능을 실행하지 않습니다.

다른 프로세서에는 이러한 문제가없는 이유가 확실하지 않습니다.

+0

그게 전부입니다. 감사! – Jagger

+0

XSLT 1.0은 매우 간결하게 작성된 스펙으로, "요소"와 "명령어"라는 용어의 차이점 중 하나는 미묘한 부분을 놓치기 쉽습니다. "확장 요소"의 정의를주의 깊게 읽으면 명령 만 확장 요소가 될 수 있으며 선언은 될 수 없다는 것이 분명합니다. 벤더 특정 선언에는 확장 요소 접두어가 필요하지 않습니다. 그러나 당신은 그 결론에 도달하기 위해 정말로 신중하게 읽어야합니다. –

관련 문제