Применить шаблон XSLT к строке, возвращаемой функцией
(весь код здесь упрощен по сравнению с оригинальной версией)
В моей компании есть функция, используемая в XSLT (1.0), которая возвращает содержимое файла из нашей файловой системы. Мне нужно иметь возможность разобрать возврат функции с помощью apply-templates
, Рассмотрим следующий пример:
Основной XML-файл:
<exhibit>
<exhibitTitle>Exhibit</exhibitTitle>
<linkedAsset href="path/to/file.xml" />
</exhibit>
Внешний XML-файл:
<externalAsset editable="true" id="U10250926378W6C">
<img src="path/to/image.png" />
<caption>Some default image</caption>
<externalAsset>
Я попытался применить следующий XSLT к основному XML-файлу:
XSLT:
<xsl:template match="linkedAsset">
<xsl:apply-templates select="cus:getFileByUri(./@href)" />
</xsl:template>
<xsl:template match="img">
<xsl:text>|-- Begin Image Source --|</xsl:text>
<xsl:value-of select="./src" />
</xsl:text>|-- End Image Source --|</xsl:text>
</xsl:template>
Результатом было просто "Некоторое изображение по умолчанию".
Чтобы убедиться, что я получаю структуру XML, а не только значение всех узлов (или чего-то еще), я попытался:
<xsl:template match="linkedAsset">
<xsl:copy-of select="cus:getFileByUri(./@href)" />
</xsl:template>
Который вернул исходную структуру внешнего XML-файла:
<externalAsset editable="true" id="U10250926378W6C">
<img src="path/to/image.png" />
<caption>Some default image</caption>
<externalAsset>
Я также попробовал:
<xsl:template match="linkedAsset">
<xsl:value-of select="cus:getFileByUri(./@href)//img/@src" />
</xsl:template>
Который вернул "path/to/image.png", как и ожидалось.
Наконец, основываясь на ответах на этот вопрос, я попробовал следующий XSLT:
<xsl:template match="linkedAsset">
<xsl:call-template name="renderExternal">
<xsl:with-param name="asset" select="cus:getFileByUri(./@href)" />
</xsl:call-template>
</xsl:template>
<xsl:template name="renderExternal">
<xsl:param name="asset" select="." />
<xsl:apply-templates select="$asset" />
</xsl:template>
Вывод был идентичен оригиналу apply-template
,
Есть ли способ подать заявку apply-templates
к значению, возвращенному из функции? Я могу четко отправить строку copy-of
, value-of
и даже выполнять xpaths на нем; могу ли я просто не использовать его с apply-templates
?
ОБЪЯСНЕНИЕ ВЫБРАННОГО ОТВЕТА
Как оказалось, решение моей проблемы было довольно конкретным (я применял шаблон к узлу, который соответствовал тому же шаблону, и это было бы непонятно из упрощенных версий предоставленного мною кода). Я действительно заработал -1 на этом. В любом случае, я чувствую, что ответ Кешлама будет наиболее полезным для людей, посещающих этот вопрос в будущем, так как он отвечает на вопрос о том, что я ДУМАЛ о своей проблеме.
1 ответ
Чтобы применить к нему apply-шаблоны, ваше расширение должно вернуть XML в таблицу стилей в уже проанализированной форме (обычно это дерево DOM или NodeIterator). В XSLT 1.0 вам, возможно, придется применить exslt:node-set()
функция расширения или эквивалент вашего процессора для обработки несоответствия импеданса между временными деревьями и наборами узлов (xsl:apply-templates работает с наборами узлов).
Детали написания и регистрации расширений могут варьироваться от процессора к процессору. Например, если вы используете Xalan-J, см. https://xml.apache.org/xalan-j/extensions.html