2014-02-19 3 views
0

(весь код здесь упрощена от его оригинальной версии)Применить шаблон 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> 

Который возвращается "путь/к/image.png", как и ожидалось.

Наконец, на основе ответов от this question, я попытался следующий 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?


ОБЪЯСНЕНИЕ ВЫБРАННОГО ОТВЕТА

Как оказалось, решение моей проблемы было довольно специфическим (я применение шаблона к узлу, который соответствовал тому же шаблону, и Wouldn» не ясны из упрощенных версий кода, который я предоставил). Я действительно заработал свой -1 на этом. ANYWAY, я чувствую, что ответ keshlam будет самым полезным для людей, которые будут посещать этот вопрос в будущем, так как он отвечает на то, что я ДУМАЮ свою проблему.

+1

«* Есть ли способ достичь этого?» «Что такое« это »? Если он скрывается где-то между всеми этими вещами, которые вы пробовали и не работали, я, конечно, пропустил это. Тот факт, что вы используете неизвестную функцию, тоже не помогает. Действительно ли это относится к тому, что вы пытаетесь достичь здесь? –

+0

@ michael.hor257k Да, извините за функцию, я думаю, я действительно недостаточно знаю о XSLT, чтобы знать, как работают функции, я просто предположил, что все они вернули строки (тесты, которые я делал выше, должны были проверить это). Во всяком случае, я * думаю * я сказал, что я * это * был в первых двух предложениях, хотя, если я могу убедить вас поднять это -1, уточнив, я с удовольствием сделаю все, что нужно (я внес некоторые незначительные изменения , Я надеюсь, что они помогут). –

+0

Вы не можете убедить меня поднять -1, потому что я не положил его туда. Вкратце, не все функции возвращают строки; некоторые возвращают другие типы данных. Особый интерес представляют типы * result-tree-fragment * и * node-set *. В какой-то момент вашего вопроса мы не видим, каков фактический результат, возвращаемый функцией. Обратите внимание, что видеть это не обязательно означает знать, какой тип данных он есть, но это было бы началом. Почему бы вам не называть '' и опубликовать результат? –

ответ

1

Чтобы выполнить шаблон-шаблон против него, ваше расширение должно вернуть XML в таблицу стилей в уже обработанной форме (обычно это дерево DOM или NodeIterator). В XSLT 1.0 вам может понадобиться применить функцию расширения exslt:node-set(), или эквивалент вашего процессора для обработки несоответствия импеданса между временными деревьями и наборами узлов (xsl: apply-templates работает с наборами узлов).

Подробная информация о возможностях записи и регистрации может варьироваться от процессора к процессору. Если вы используете Xalan-J, например, см. https://xml.apache.org/xalan-j/extensions.html

+0

Моя проблема оказалась совсем другой, но это, безусловно, лучший ответ на то, что я * думал * моя проблема. Благодаря! –

Смежные вопросы