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 ответа

Решение

Я подозреваю, что у вас есть пространство имен по умолчанию, объявленное в вашей таблице стилей. Это эффективно поместит элементы и в пространство имен. Чтобы выбрать элементы, удовлетворяющие пространству имен, используя XPath 1.0, вы всегда должны использовать префикс в выражении.

Так что если у вас есть что-то вроде этого в верхней части таблицы стилей:

<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 здесь

Другие вопросы по тегам