Получение каталога таблиц стилей из файла XSL - для настраиваемого расположения XML - PullRequest
1 голос
/ 27 февраля 2010

У меня есть xsl-файл для xml. Расположение файлов xml должно быть настраиваемым (это делается путем настройки пути href к таблице стилей в xml), но xsl использует некоторые изображения и некоторые другие файлы javaScript и должен иметь путь к ним. Путь находится рядом с файлом таблицы стилей, поэтому, как только я смогу получить каталог xsl, я могу получить к ним доступ. например: в моем XML у меня есть:? xml-stylesheet type = "text / xsl" href = ". \ Files \ Style \ test.xsl"> Я хочу из xsl указать ". \ Files \ Style" для расположения изображений Как я могу это сделать

1 Ответ

1 голос
/ 01 марта 2010

Вот решение XSLT 1.0 (XSLT 2.0 обладает гораздо более мощными функциями для обработки строк, такими как регулярные выражения):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="processing-instruction()">
   <xsl:variable name="vpostHref"
    select="substring-after(., 'href=')"/>

   <xsl:variable name="vhrefData1"
    select="substring($vpostHref,2)"/>

   <xsl:variable name="vhrefData2"
    select="substring($vhrefData1, 1,
                      string-length($vhrefData1)-1
                      )"/>

   <xsl:call-template name="stripBackwards">
    <xsl:with-param name="pText"
      select="$vhrefData2"/>
    <xsl:with-param name="pTextLength"
     select="string-length($vhrefData2)"/>
   </xsl:call-template>
 </xsl:template>

 <xsl:template name="stripBackwards">
  <xsl:param name="pText"/>
  <xsl:param name="pStopChar" select="'\'"/>
  <xsl:param name="pTextLength"/>

  <xsl:choose>
   <xsl:when test="not(contains($pText, $pStopChar))">
     <xsl:value-of select="$pText"/>
   </xsl:when>
   <xsl:otherwise>
     <xsl:variable name="vLastChar"
       select="substring($pText,$pTextLength,1)"/>
     <xsl:choose>
       <xsl:when test="$vLastChar = $pStopChar">
        <xsl:value-of select="substring($pText,1,$pTextLength -1)"/>
       </xsl:when>
       <xsl:otherwise>
        <xsl:call-template name="stripBackwards">
          <xsl:with-param name="pText"
           select="substring($pText,1,$pTextLength -1)"/>
          <xsl:with-param name="pTextLength" select="$pTextLength -1"/>
          <xsl:with-param name="pStopChar" select="$pStopChar"/>
        </xsl:call-template>
       </xsl:otherwise>
     </xsl:choose>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему документу XML :

<?xml-stylesheet type="text/xsl" href=".\Files\Style\test.xsl"?>
<t/>

получен правильный результат :

.\Files\Style
...