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