Как удалить некоторый контент из элементов с помощью XSLT

109
10

Для тега изображения мне нужно сохранить только файл изображения с содержимым "file/" с помощью XSLT в выводе JSON:

Мой входной файл XML:

<image>binary/alias/my.jpg</image>

XSL, который используется как:

<xsl:template match="image">
image: <xsl:apply-templates/>,
</xsl:template>

Выход JSON, который я получаю:

image: binary/alias/my.jpg

Мне нужен вывод:

image: files/my.jpg

Пожалуйста помоги мне с этим. Заранее спасибо.

спросил(а) 2021-01-19T21:05:53+03:00 6 месяцев назад
1
Решение
64

В XSLT 2.0 вы можете:

<xsl:template match="image">
<xsl:text>image: files/</xsl:text>
<xsl:value-of select="tokenize(., '/')[last()]"/>
</xsl:template>

ответил(а) 2021-01-19T21:05:53+03:00 6 месяцев назад
45

Чтобы получить строку после последнего вхождения символа (в этом случае "/"), вам понадобится (в XSLT-1.0) рекурсивный шаблон. Применяя этот шаблон, решение прост: выведите желаемый текст префикса "image: files/" и добавьте результат рекурсивного шаблона:

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

<xsl:template match="image">
image: files/<xsl:call-template name="LastOccurrence">
<xsl:with-param name="value" select="text()" />
<xsl:with-param name="separator" select="'/'" />
</xsl:call-template>
</xsl:template>

<xsl:template name="LastOccurrence">
<xsl:param name="value" />
<xsl:param name="separator" select="'/'" />

<xsl:choose>
<xsl:when test="contains($value, $separator)">
<xsl:call-template name="LastOccurrence">
<xsl:with-param name="value" select="substring-after($value, $separator)" />
<xsl:with-param name="separator" select="$separator" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$value" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

Шаблон LastOccurrence был вдохновлен этим сообщением SO.

ответил(а) 2021-01-19T21:05:53+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема