XSL msxsl: проблема с набором узлов
Пожалуйста, помогите мне, ребята. Я просто пытаюсь объявить простой фрагмент дерева результатов и перебрать его.
...
<xsl:variable name="rtf">
<item-list>
<item id="1">one</item>
<item id="2">two</item>
<item id="3">three</item>
<item id="4">four</item>
</item-list>
</xsl:variable>
<xsl:for-each select="msxsl:node-set($rtf)/item-list/item">
<xsl:value-of select="@id"/>
</xsl:for-each>
...
Я полностью ошибаюсь, как это работает?
Редактировать: я использую.NET XslCompiledTransform и имею правильные объявления пространства имен msxsl - xmlns:msxsl="urn:schemas-microsoft-com:xslt"
Преобразование выполняется нормально - проблема в том, что ничего не выводится
3 ответа
Я подозреваю, что у вас есть пространство имен по умолчанию, объявленное в вашей таблице стилей. Это эффективно поместит элементы
Так что если у вас есть что-то вроде этого в верхней части таблицы стилей:
<xsl:stylesheet xmlns="http://example.com"...>
Тогда вам нужно также добавить это:
<xsl:stylesheet xmlns="http://example.com" xmlns:x="http://example.com"...>
А затем используйте префикс "x" в выражении XPath:
<xsl:for-each select="msxsl:node-set($rtf)/x:item-list/x:item">
<xsl:value-of select="@id"/>
</xsl:for-each>
Дайте мне знать, если это сработало. Я только спекулирую здесь.
В отличие от MSXSL, XslCompiledTransform
обеспечивает node-set()
функция, где она должна быть - в общем пространстве имен EXSLT:
<xsl:stylesheet xmlns:exslt="http://exslt.org/common">
...
<xsl:for-each select="exslt:node-set($rtf)/item-list/item">
...
</xsl:stylesheet>
Это выглядит хорошо для меня.
Правильно ли вы объявили пространство имен msxsl для функций расширения? Что-то вроде этого:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
Я предполагаю, что вы используете процессор Microsoft XSLT здесь