7

生成された出力ファイルに、スタイルシートへの相対パスを指すファイル パスを含めたいと思います。スタイルシートの場所は変更される可能性があり、スタイルシートにパラメーターを使用したくありません。これに対する私の解決策は、完全なスタイルシート URI を取得することです。

<xsl:variable name="stylesheetURI" select="document-uri(document(''))" />

からファイル名を切り取るだけです$stylesheetURIこれは、PHP 関数basenameおよびdirnameの XSLT 2.0 クローンを作成するきっかけになりました。

<xsl:function name="de:basename">
    <xsl:param name="file"></xsl:param>
    <xsl:sequence select="tokenize($file, '/')[last()]" />
</xsl:function>

<xsl:function name="de:dirname">
    <xsl:param name="file"></xsl:param>
    <xsl:sequence 
        select="string-join(tokenize($file, '/')[position() != last()], '/')" />
</xsl:function>

これで、テンプレートで次のようなことができます。

<img src="{concat(de:dirname($stylesheetURI),'/img/myimage,png')}" />

私の質問は: ネイティブ XSLT 2.0 でこれを達成するためのより良い/より高速な方法はありますか?

4

1 に答える 1

8

私はこれらの関数を(あまり広範囲ではありませんが) テストしましたが、提供されているものよりも25% 高速に実行されるようです。もちろん、結果は文字列の長さと修飾子の数によって異なります。

  <xsl:function name="de:basename" as="xs:string">
    <xsl:param name="pfile" as="xs:string"/>
    <xsl:sequence select=
     "de:reverseStr(substring-before(de:reverseStr($pfile), '/'))
     " />
  </xsl:function>

  <xsl:function name="de:dirname" as="xs:string">
    <xsl:param name="pfile" as="xs:string"/>
    <xsl:sequence select=
     "de:reverseStr(substring-after(de:reverseStr($pfile), '/'))
     " />
  </xsl:function>

  <xsl:function name="de:reverseStr" as="xs:string">
    <xsl:param name="pStr" as="xs:string"/>

    <xsl:sequence select=
    "codepoints-to-string(reverse(string-to-codepoints($pStr)))"/>
  </xsl:function>
于 2010-06-25T13:18:04.320 に答える