在XSLT中执行文件路径操作

时间:2010-06-25 09:29:36

标签: php xslt function filepath

我希望生成的输出文件包含指向相对于样式表的路径的文件路径。样式表的位置可以更改,我不想使用样式表的参数。我的解决方案是获取完整的样式表URI:

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

现在我只需要从$stylesheetURI切断文件名。这激发了我编写PHP函数basenamedirname的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?

1 个答案:

答案 0 :(得分: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>