XSL msxsl: проблема с набором узлов - PullRequest
5 голосов
/ 07 декабря 2009

Пожалуйста, помогите мне, ребята. Я просто пытаюсь объявить простой фрагмент дерева результатов и перебрать его.


...

<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 ]

8 голосов
/ 08 декабря 2009

Я подозреваю, что у вас есть пространство имен по умолчанию, объявленное в вашей таблице стилей. Это эффективно поместит элементы и в пространство имен. Чтобы выбрать элементы, удовлетворяющие пространству имен, используя 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>

Дайте мне знать, если это сработало. Я только размышляю здесь.

4 голосов
/ 08 декабря 2009

В отличие от 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>
1 голос
/ 07 декабря 2009

Это выглядит нормально для меня.

Правильно ли вы объявили пространство имен msxsl для функций расширения? Примерно так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">

Я предполагаю, что вы используете процессор Microsoft XSLT здесь

...