2016-11-19 2 views
0

Мне нужно передать узел в качестве параметра в таблицу стилей XSL. Проблема в том, что параметр отправляется как строка. Я видел несколько вопросов SO по этой теме, и я знаю, что решение (в XSLT 1.0) заключается в использовании внешней функции node-set() для преобразования строки в набор узлов.Передача узла как параметра в таблицу стилей XSL

Моя проблема в том, что я использую eXist DB. Кажется, я не могу заставить его XSLT-процессор найти любую такую ​​функцию. Я пробовал EXSLT node-set() из пространства имен http://exslt.org/common, а также версию Saxon и Xalan (я думаю, что eXist использовал Xalan, но теперь это может быть Saxon).

Являются ли эти расширения допустимыми даже в XSLT-процессоре, используемом eXist? Если нет, есть ли что-то еще, что я могу сделать?

+0

Ну, вы можете сначала просмотреть информацию о вашем используемом XSLT-процессоре со стилем, например http://home.arcor.de/martin.honnen/xslt/processorTest3.xml, для вывода таких свойств, как 'system-property ('xsl: vendor ') 'и' system-property (' xsl: product-version ') '. Что касается ваших текущих попыток, используете ли вы код Java для преобразования XSLT или XQuery? Рассмотрим, чтобы показать детали этого кода, передающего параметр и выполняющего преобразование. –

+1

Вы не хотите читать другие подобные вопросы/ответы SO, если они не связаны конкретно с eXist, поскольку способ передачи параметров в XSLT-преобразование зависит от деталей API, предлагаемых конкретным продуктом, и который зависит от одного продукта другому. И НЕ является целью функции node-set() для синтаксического анализа XML, поставляемого в виде строки, хотя некоторые реализации делают это. –

+1

http://exist-db.org/exist/apps/fundocs/view.html?uri=http://exist-db.org/xquery/transform&location=java:org.exist.xquery.functions.transform.TransformModule&details = true говорит о параметрах. Параметры «Таблицы стилей» могут передаваться в третьем аргументе с использованием фрагмента XML со следующей структурой: «' ". Кажется, что параметры, по крайней мере для функции 'transform', являются просто парами имен/значений. –

ответ

1

Согласно комментариям Мартина Honnen, я не» t думаю, что можно передать узел XML через структуру <parameters> функции transform:transform() в eXist. Функция, похоже, отбрасывает любые теги XML, переданные ей как значение.

В качестве обходного пути я перенесу как мой входной XML, так и мой параметр XML в корневой элемент и передаю его как вход в функцию преобразования.

+2

Вы правы. Функция transform: transform позволяет преобразовывать строки как значения параметров в преобразование, решение, которое вы определили, - это изменить входной документ на преобразование, чтобы обернуть узел параметра. Мы планируем добавить теперь стандартизованный fn: transform (от XQuery 3.0) к eXist в ближайшем будущем, чтобы заменить transform: transform, который позволит вам отправлять узлы (или любой тип) в качестве параметра. – adamretter

+0

Благодарим вас за разъяснение Адама. – pajevic

1

Для ссылки или преобразования документов из базы данных, вы должны пройти путь в качестве параметра преобразования, а затем обратиться к нему с помощью параметра и переменной

(: xquery :) 

let $path-to-document := "/db/test/testa.xml" 
let $stylesheet := 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="source" required="no"/> 
    <xsl:variable name="error"><error>doc not available</error></xsl:variable> 
    <xsl:variable name="theDoc" select="if (doc-available($source)) then doc($source) else $error"/> 
    <xsl:template match="/"> 
     <result><xsl:value-of select="$source"/> - <xsl:value-of select="node-name($theDoc/*)"/></result> 
    </xsl:template> 
</xsl:stylesheet> 


return transform:transform(<dummy/>,$stylesheet, <parameters><param name="source" value="xmldb:exist://{$path-to-document}"/></parameters>) 
+0

Спасибо, но мой XML не находится в базе данных. Это фрагмент в памяти. – pajevic

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