XSLT 1.0 - Создать набор узлов и передать в качестве параметра

Используя XSLT 1.0, я пытаюсь создать небольшой набор узлов, а затем передать его в качестве параметра в шаблон, что-то вроде следующего:

<xsl:call-template name="widget">
  <xsl:with-param name="flags">
    <items>
      <item>widget.recent-posts.trim-length=100</item>
      <item>widget.recent-posts.how-many=3</item>
      <item>widget.recent-posts.show-excerpt</item>
    </items>
  </xsl:with-param>
</xsl:call-template>

Идея состоит в том, что тогда изнутриwidget Шаблон я мог бы написать что-то вроде:

<xsl:value-of select="$flags/item[1]" />

Очевидно, я получаю ошибки компиляции .. как я могу добиться такого рода вещи?

Ответы на вопрос(2)

Решение Вопроса

В XSLT 1.0 есть способ (нестандартный) динамически создавать временные деревья и оценивать выражения XPath на них,Однако это требует использованияxxx:node-set() функция.

Всякий раз, когда узлы динамически создаются внутри телаxsl:variable илиxsl:paramтип этогоxsl:variable / xsl:param это RTF (Фрагмент дерева результатов) и W3 XSLT 1.0 Spec. строго ограничивает вид выражений XPath, которые могут быть оценены по отношению к RTF.

Как обходной путь, почти каждый поставщик XSLT 1.0 имеет свой собственныйxxx:node-set() расширение функция, которая принимает RTF и создает из него обычный набор узлов.

Пространство имен, в котороеxxx префикс (или любой другой префикс, который вы выберете) связан по-разному для разных поставщиков. Для MSXML и двух процессоров .NET XSLT это:"urn:schemas-microsoft-com:xslt", Библиотека EXSLT использует пространство имен:"http://exslt.org/common", Это пространство имен EXSLT реализовано на многих процессорах XSLT 1.0, и рекомендуется использовать егоxxx:node-set() продление, если это возможно.

Вот быстрый пример:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:ext="http://exslt.org/common"
  exclude-result-prefixes="ext msxsl"
 >
 <xsl:template match="/">
  <xsl:variable name="vTempRTF">
   <a>
    <b/>
   </a>
  </xsl:variable>

  <xsl:copy-of select="ext:node-set($vTempRTF)/a/*"/>
 </xsl:template>
</xsl:stylesheet>

Сначала добавьте пользовательское пространство имен в таблицу стилей, например,xmlns:myns="http://my.ns.com"

Затем определите набор узлов в верхней части таблицы стилей:

<myns:recent-posts-flags>
    <item>widget.recent-posts.trim-length=100</item>
    <item>widget.recent-posts.how-many=3</item>
    <item>widget.recent-posts.show-excerpt</item>
</myns:recent-posts-flags>

Затем ссылка следующим образом:

<xsl:call-template name="widget">
    <xsl:with-param name="flags" select="document('')/*/myns:recent-posts-flags" />
</xsl:call-template>

Это работает, но для меня все равно было бы идеально определить набор узлов внутри<xsl:with-param> сам тег, как в первом примере, который я дал .. кто-нибудь думает, что это будет возможно?

 Lilleman23 окт. 2012 г., 16:02
Да. Только я плохо читаю и быстро гуглю. > _ <
 lbrutti06 мая 2019 г., 12:54
Здравствуйте, кому-нибудь из вас удавалось использовать этот подход с PHP? похоже, что php XSLTProcessor не может справиться сdocument('') Вызов ...
 John J. Camilleri23 окт. 2012 г., 14:25
Это именно то, что я сказал во второй строке ответа.
 Lilleman23 окт. 2012 г., 13:28
Вам также нужно определить «myns», иначе преобразование не удастся. Я нашел это:stackoverflow.com/questions/5873954/namespaces-in-xslt это помогло мне сконфигурировать добавление xmlns: myns = "локальный"к моему xsl: stylesheet-node исправлена ​​эта проблема.
 user35781207 окт. 2010 г., 15:14
+1 Это FAQ и тоже вфункции: In addition, the xsl:stylesheet element may contain any element not from the XSLT namespace, provided that the expanded-name of the element has a non-null namespace URI. (...) Such elements can provide, for example, information used by extension elements or extension functions, information about what to do with the result tree, information about how to obtain the source tree, metadata about the stylesheet, structured documentation for the stylesheet.

Ваш ответ на вопрос