Может ли 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/