Применить шаблон 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

Другие вопросы по тегам