Как использовать node -set-функцию независимым от платформы способом?

Я пишу некоторый файл xlst, который я хочу использовать под Linux и Windows. В этом файле я использую функцию node -set, которая объявлена ​​в разных пространствах имен для MSXML и xsltproc ( "urn: schemas-microsoft-com: xslt" и " http://exslt.org/common" соответственно). Существует ли какой-либо независимый от платформы способ использования node -set?

Ответ 1

Вы можете использовать функцию function-available(), чтобы определить, какую функцию вы должны использовать:

<xsl:choose>
  <xsl:when test="function-available('exslt:node-set')">
    <xsl:apply-templates select="exslt:node-set($nodelist)" />
  </xsl:when>
  <xsl:when test="function-available('msxsl:node-set')">
    <xsl:apply-templates select="msxsl:node-set($nodelist)" />
  </xsl:when>
  <!-- etc -->
</xsl:choose>

Вы можете даже обернуть эту логику в именованном шаблоне и вызвать ее с помощью набора узлов в качестве параметра.

Ответ 2

Да, есть хорошее и универсальное решение.

EXSLT функция общая: node -set() может быть реализована как встроенная функция Javascript и, таким образом, доступна в любом браузере, который поддерживает Javascript (практически все основные браузеры без исключения).

Этот метод был впервые обнаружен Julian Reschke и после того, как он опубликовал его на xsl-list, был опубликован Дэвид Карлайл > . На блоге Дэвида Карлайл есть также ссылка на тестовую страницу, которая показывает, если общий: node Таким образом, функция -set() работает с браузером по вашему выбору.

Подводя итог:

  • Сначала перейдите здесь и прочитайте объяснение.
  • Затем попробуйте тестовую страницу. В частности, убедитесь, что он работает с IE (это означает, что MSXML)
  • Наконец, используйте код.

Удовольствие!

Ответ 3

Exslt является "предположительным" независимым от платформы набором расширений xslt, но только постольку, поскольку различные процессоры xslt выбирают для их реализации.

Там некоторые доказательства, которые MSXML действительно поддерживает exsl: node -set(), но я точно не знаю.

Существует старая статья, обсуждающая реализацию exslt поверх MSXML.

В противном случае, я думаю, function-available() - ваш друг:)

Ответ 4

Firefox 3 реализует node -set (как часть улучшений пространства имен EXSLT 2.0) в его обработке на стороне клиента XSLT.

Возможно, не совсем тот ответ, который вы искали - но это может быть, в зависимости от контекста вашей проблемы.; -)

Ответ 5

Если нет конкретной причины использовать реализацию msxml node -set в окнах, вы можете использовать exslt везде, включив в себя реализацию, загруженную из http://exslt.org с вашей таблицей стилей, exslt howto описывает необходимые шаги. Вы можете использовать путь "Расширение имен" или "Именованные шаблоны".