Как использовать функцию набора узлов независимым от платформы способом? - PullRequest
11 голосов
/ 18 сентября 2008

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

Ответы [ 5 ]

8 голосов
/ 18 сентября 2008

Вы можете использовать функцию 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>

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

7 голосов
/ 01 декабря 2008

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

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

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

Подведем итог:

  1. Сначала зайдите сюда и прочитайте объяснение.
  2. Тогда попробуйте тестовую страницу. В частности, убедитесь, что он работает с IE (то есть с MSXML)
  3. Наконец, используйте код.

Наслаждайтесь!

3 голосов
/ 19 сентября 2008

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

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

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

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

1 голос
/ 18 сентября 2008

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

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

0 голосов
/ 19 сентября 2008

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

...