2012-02-20 4 views
4

1つのスタイルシート内の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-xsl:レベルで、それはまだコンパイルに失敗したときにxsl:を試しました。ありがとう。 –

+0

@ SeanB.Durkin:どうぞよろしくお願いいたします。 –

+0

@DimitreNovatchevこれはちょうど私の一日を保存しました、ありがとう:) – quaylar

関連する問題