2012-02-20 3 views
4

하나의 스타일 시트에서 XSLT 2.0 및 XSLT 3.0 프로세서 모두에서 unparsed-text-lines() 함수를 효과적으로 사용하려면 어떻게해야합니까?아직 XSLT에서 사용할 수없는 기능에 대한 코드가 어떻게 대체 되나요?

필자는 function-available() 함수를 사용할 수 있다고 생각했지만 XSLT 2.0 프로세서의 구문 오류를 반환합니다.

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:local="local" 
    version="2.0" exclude-result-prefixes="xs fn local"> 

<xsl:function name="local:unparsed-text-lines" as="xs:string+"> 
<xsl:param name="href" as="xs:string" /> 
<xsl:choose> 
    <xsl:when test="function-available('fn:unparsed-text-lines')"> 
    <!-- XSLT 3.0 --> 
    <xsl:sequence select="fn:unparsed-text-lines($href)" /> 
    </xsl:when> 
    <xsl:otherwise> 
    <!-- XSLT 2.0 --> 
    <xsl:sequence select="fn:tokenize(fn:unparsed-text($href), '\r\n|\r|\n')[not(position()=last() and .='')]" /> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:function> 

etc. 

답변

5

문제는입니다 :

<xsl:when>

는 런타임 운영자이며, 그 결과는 true() 또는 false() 될 것이라고 컴파일러는 컴파일 타임에 알 수 없습니다.

해결책 : use-when 속성을 사용하십시오.

변환은 다음과 같이된다 :

<xsl:stylesheet 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:local="local" 
     version="2.0" exclude-result-prefixes="xs local"> 

    <xsl:function name="local:unparsed-text-lines" as="xs:string+"> 
    <xsl:param name="href" as="xs:string" /> 
     <xsl:sequence select="fn:unparsed-text-lines($href)" 
      use-when="function-available('unparsed-text-lines')" /> 
     <xsl:sequence use-when="not(function-available('unparsed-text-lines'))" 
     select="tokenize(unparsed-text($href), '\r\n|\r|\n') 
        [not(position()=last() 
         and 
          .='' 
         ) 
        ]" /> 
    </xsl:function> 
</xsl:stylesheet> 

을 지금 오류가을 발생하지 않습니다.

+0

감사합니다. 나는 원래 xsl : use-when을 xsl : level에서 시도했으나 여전히 컴파일에 실패했다. 감사. –

+0

@ SeanB.Durkin : 천만에요. –

+0

@DimitreNovatchev 이것은 단지 내 하루를 저장, 감사합니다 :) – quaylar

관련 문제