Выполнение манипуляций с путями файлов в XSLT


Я бы хотел, чтобы мой сгенерированный выходной файл содержал пути к файлам, указывающие на путь относительно таблицы стилей. Расположение таблицы стилей может измениться, и я не хочу использовать параметр для таблицы стилей. Мое решение для этого состоит в том, чтобы получить полный URI таблицы стилей:

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

Теперь мне нужно только отрезать имя файла от $stylesheetURI. Это вдохновило меня на написание XSLT 2.0 клонов функций PHP базовое имя и имя файла:

<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?

Author: chiborg, 2010-06-25

1 answers

Я протестировал (не слишком тщательно) эти функции , и они , похоже, выполняют на 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>
 7
Author: Dimitre Novatchev, 2010-06-25 13:18:04