Может ли XSLT анализировать строку текста?

Это мой первый раз, используя XSLT. Я пытаюсь создать файл, который преобразует файл XML-данных, экспортированный из программы, которую я использую в отчет HTML.

одним из значений элемента является путь к файлу изображения, но созданный путь является абсолютным путем, таким как

C:Documents and SettingsmeDesktopxml exportcd000402.jpg

но я хочу относительный путь только к имени файла.

есть ли способ через XLST-файл разобрать имя файла?

5 ответов


XPath содержит substring-after функция, которая возвращает строку после первый появление другой строки. Этого недостаточно само по себе, но шаблон, такой как следующий, может это сделать:

<xsl:template name="filename-only">
    <xsl:param name="path" />
    <xsl:choose>
        <xsl:when test="contains($path, '\')">
            <xsl:call-template name="filename-only">
                <xsl:with-param name="path" select="substring-after($path, '\')" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$path" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

набор доступных строковых функций не очень обширен, но я обнаружил, что он достаточно хорош для большинства приложений, которые вам понадобятся в XSLT.


Это немного выходит за рамки вопроса, но Майкл Кей имеет отличную бумагу при использовании XSLT 2 для разбора чистого текста в XML.


Да, вижу общий парсер LR(1), реализованный в XSLT 2.0. (всего в 245 линий).

я реализовал с ним парсер для JSON и парсер для XPath 2.0 -- полностью в XSLT.


XSLT с помощью XPath 2.0 и его различных строковые функции помогает ему справиться с такого рода вещами.

пример:
Предполагая, что путь [к файлу jpg], упомянутый в вопросе, происходит из фрагмента xml, похожего на

...
<For_HTML>
   <Image1>
      <Path>C:\Documents and Settings\me\Desktop\xml export\cd000402.jpg</Path>
      <Description>Photo of the parking lot</Description>
      <Width>123</Width>
      ...
    </Image1>
</For_HTML>

фрагмент XSLT будет выглядеть примерно так:

<xsl:template match='//For_HTML/Image1'> 
     <img src='http://myNewServer.com/ImageBin/{substring-after(./Path,"\xml export\")}'
          alt='{./Description}'
          width=' ....  you got the idea'
     /> 
</xsl:template>

Примечание: не было времени проверить, но это похоже на правду.


Это возможно. Я разработал следующий сценарий: http://barsand.wordpress.com/2012/06/19/can-an-xslt-parse-a-string-of-text/