вызывать XQuery из XSLT, динамически создавать XSLT в XQuery? - PullRequest
0 голосов
/ 23 октября 2018

Среда: eXist-db 4.2.1, XQuery 3.1, XSLT 2.0

Мне необходимо выполнить преобразование XSLT в eXist-DB с использованием XQuery.В какой-то момент XSLT должен искать в сотнях документов совпадения по значению атрибута узла.Вызов collection() из XSLT в eXist-DB , похоже, не работает .

Я провел некоторые поиски других способов решения этой проблемы, и, не найдя ничего, я 'm здесь два вопроса:

  1. Возможно динамически писать и преобразовывать XSLT из XQuery, что позволяет мне динамически вводить значения из самого XQuery (параметров на xquery transform:transform() недостаточноздесь)

  2. Можно ли каким-либо образом вызывать / получать результаты из (eXist) документа / функции XQuery из XSLT?

Спасибо за любые мнения и ссылки.

1 Ответ

0 голосов
/ 23 октября 2018

Поскольку XSLT - это XML, а с помощью XQuery вы можете создавать XML, вы, конечно же, можете создавать XSLT на лету и вставлять данные, которые вы собрали в другом месте в XQuery, следующий пример, конечно, глупый, но он создает некоторые данные в XQuery, создает XSLTТаблица стилей на лету вводит некоторые из этих данных непосредственно в виде значения параметра, а затем запускает XSLT:

declare namespace xsl = "http://www.w3.org/1999/XSL/Transform";

let $elements := (1 to 3)!<root><data>{.}</data></root>,
    $stylesheet := 
      <xsl:stylesheet version="2.0">
        <xsl:param name="data-elements" as="element()*">{$elements!data}</xsl:param>
        <xsl:template match="@* | node()">
          <xsl:copy>
             <xsl:apply-templates select="@* | node()"/>
          </xsl:copy>
        </xsl:template>
        <xsl:template match="foo[. = $data-elements]"/>
      </xsl:stylesheet>,
    $input := <root><list><foo>a</foo><foo>2</foo><foo>10</foo><foo>1</foo></list></root>
return transform:transform($input, $stylesheet, ())
...