현재 다양한 버전의 Saxon-Processor를 사용하는 순수 XSL 변환 작업을하고 있습니다.XSLT 함수가 다른 결과를 반환합니다 [Saxon-EE Saxon-HE/PE]
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:foo="bar">
<xsl:output encoding="UTF-8" method="text"/>
<xsl:template match="/">
<xsl:text>Call of func_1: </xsl:text>
<xsl:value-of select="foo:func_1()"/>
<xsl:text>
Call of func_1: </xsl:text>
<xsl:value-of select="foo:func_1()"/>
<xsl:text>
Call of func_1: </xsl:text>
<xsl:value-of select="foo:func_1()"/>
<xsl:text>
Call of func_2: </xsl:text>
<xsl:value-of select="foo:func_2()"/>
</xsl:template>
<xsl:function name="foo:func_1" as="xs:string">
<!-- do some other stuff -->
<xsl:value-of select="foo:func_2()"/>
</xsl:function>
<xsl:function name="foo:func_2" as="xs:string">
<xsl:variable name="node">
<xsl:comment/>
</xsl:variable>
<xsl:sequence select="generate-id($node)"/>
</xsl:function>
</xsl:stylesheet>
설명
foo:func_1
무시 될 수있는 두 번째 함수 + 다른 물건을 값을 반환하는 래퍼 함수가된다 아래는 내 질문의 요구에 대한 단순화 된 나의 짧은 스타일이며, . 함수의이 개념은 다른 함수를 호출하는 것이 필수입니다!
foo:func_2
은 요소에 대해 고유 한 ID를 생성합니다. 이 요소는 "node"라는 로컬 범위 변수에 작성됩니다. 색슨 버전을 기반으로
다른 결과
예상 된 결과 :
Call of func_1: d2
Call of func_1: d3
Call of func_1: d4
Call of func_2: d5
색슨-EE 9.6.0.7/색슨-EE 9.6.0.5 결과
Call of func_1: d2
Call of func_1: d2
Call of func_1: d2
Call of func_2: d3
색슨 -HE 9.6.0.5/삭스 에-PE 9.6.0.5/색슨-EE는 9.5.1.6/색슨-HE가 발생할 9.5.1.6
like expected
또한 깊이
에 내가 늘어나는만큼 내 자신의 문제를 디버깅/질문 나는 할 수 있었다. 함수 "func_1"의 xsl:value-of
을 xsl:sequence
으로 변경하면 [예기치 않은] 모든 버전에서 결과가 동일하게됩니다. 하지만 그건 내 의도가 아니야!
색슨 버전에서 xsl:value-of
과 xsl:sequence
의 차이점은 무엇입니까? "숨겨진"캐싱이 있습니까? 필자의 경우 xsl:sequence
과 xsl:value-of
으로 작업하는 올바른 방법은 무엇입니까? [btw : 나는 이미 알고있다. value-of은 select-statement 결과로 텍스트 노드를 만든다. 시퀀스는 노드 또는 원자 값에 대한 참조가 될 수 있습니다. 내 문제를 afaik 해결하지 마십시오]
흥미로운 문제입니다. 하지만 왜'as = "xs : string"'을 사용하여 문자열을 반환하는 것으로 선언 된 함수를 작성하는지 이해하지 못합니다. 그런 다음 텍스트 노드를 반환하는'xsl : value-of'를 사용합니다 (문자열을 캐스팅해야 함). 'as' 선언과 일치시킵니다). –
Saxon 9.7 EE에서 명령 행에서'opt : 0'을 사용하여 최적화를 끄면 결과는 각 호출마다 다른 id가됩니다. 따라서 EE가 결과를 변경하는 최적화를 수행하고있는 것으로 보입니다. –
XSLT 3.0은'new-each-time' 속성으로 https://www.w3.org/TR/xslt-30/#function-determinism의 문제를 해결하려고합니다. –