Копирование элемента (xsl: function) из таблицы стилей в XML-файл «result» - PullRequest
1 голос
/ 25 апреля 2011

Во-первых, я должен сказать, что я новичок с точки зрения XSLT.

Хотя точный контекст может быть не столь актуален (и может быть слишком запутанным), я предоставлю его ниже.У меня есть цепное преобразование, которое выглядит так:

  1. Input.xml - это входной файл для этого преобразования, которое выполняется с использованием transform.xsl.Результат этого преобразования output.xml.transform.xml содержит классический пользовательский элемент xsl:function:

    xsl:function name="my:f"
         xsl:sequence select=".. xpath .."   
    xsl:function
    
  2. Результатом шага 1 (output.xml) для шага 2 является новый трансформатор (transform2.xsl), который будет использовать какой-то другой ввод XML (скажем, input2.xml).

Что я хотел бы сделать, это полностью скопировать xsl:function узел (присутствует в transform.xsl на шаге 1) до output.xml, чтобы его можно было использовать на шаге 2. В этом случае не требуется никаких обновлений / изменений для xsl:function при копировании (просто простая копия узла)).Обратите внимание, что я не хочу копировать xsl:function только при наличии заданного элемента ввода (из input.xml).Но, скорее, я хочу копировать его всегда, независимо от того, что является input.xml.

Теперь я знаю, что это можно сделать, имея отдельный файл, содержащий мой xsl:function, а затем используя xsl:importчтобы включить этот файл из обоих преобразований (transform.xml и transform2.xml).

Но я хотел бы знать, есть ли другие способы сделать это (... без отдельного файла, в котором объявлена ​​функция/ определено)?

Заранее спасибо,

М.

Ответы [ 2 ]

1 голос
/ 25 апреля 2011

Вы можете получить доступ к документу таблицы стилей, используя document(''), например,

<xsl:template match="/*">
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:copy-of select="document('')/xsl:stylesheet/xsl:function"/>
    <xsl:apply-templates/>
  </xsl:stylesheet>
</xsl:template>

должен скопировать любые элементы xsl:function в таблице стилей в дерево результатов.

[править] После редактирования кажется, что вы хотите скопировать функцию с определенным именем: если вы хотите скопировать функцию с определенным именем, вы можете сделать, например,

<xsl:copy-of select="document('')/xsl:stylesheet/xsl:function[
        resolve-QName(@name, .) eq QName('http://example.com/ns', 'f')]"/>

где f - локальное имя функции, а http://example.com/ns - пространство имен, в котором определена функция.

0 голосов
/ 25 апреля 2011

Вы можете использовать встроенную функцию document(), которая возвращает документ таблицы стилей для emtpy URI. Затем вы можете просто скопировать элемент на выход.

...