XSLT: обработка узла XML, установленного в шаблоне, при этом все еще есть доступ к корню документа - PullRequest
1 голос
/ 24 июня 2010

У меня есть таблица стилей xslt, которая должна вызвать функцию расширения C # XSLT для обработки коллекции элементов. Код выглядит примерно так:

XSLT:

<xsl:apply-templates mode="MyTemplate" select="myextension:GetSomeCollection(@someattribute)" />
<xsl:template mode="MyTemplate" match="myroot">
  <xsl:value-of select="xpath" />...<xsl:value-of select="/xpath" />
</xsl:template>

Метод расширения:

public XPathNavigator GetSomeCollection(string Attribute)
{
    XmlDocument doc = new XmlDocument()
    //etc... 
    return doc.CreateNavigator();
}

Метод расширения возвращает XPathNavigator, так как это единственный способ, который я вижу для метода расширения для возврата любого вида коллекции.

Проблема, с которой я сталкиваюсь, заключается в том, что мой шаблон (шаблон с mode = "MyTemplate") должен иметь возможность доступа к узлам xml в корневом / входном документе к таблице стилей xslt (а также к узлам в наборе узлов возвращается методом расширения), однако шаблон, похоже, имеет доступ только к фрагменту xml, возвращаемому GetSomeCollection - выражения xpath, начинающиеся с /, просто разрешают начало этого фрагмента.

Я понимаю, почему это так (шаблон обрабатывает фрагмент xml, однако этот фрагмент принадлежит другому документу), однако я не вижу, как его обойти. Кажется, нет никакого способа получить метод расширения для создания фрагмента XML, принадлежащего исходному документу.

Что я могу сделать?

1 Ответ

3 голосов
/ 24 июня 2010

Использовать переменную?

<xsl:variable name="root" select="/"/>
<xsl:template mode="MyTemplate" match="myroot">
  <xsl:value-of select="$root/..."/>
  <xsl:value-of select="xpath" />...<xsl:value-of select="/xpath" />
</xsl:template>

или параметр:

<xsl:apply-templates mode="MyTemplate"
       select="myextension:GetSomeCollection(@someattribute)">
  <xsl:with-param name="foo" select="...some local query..."/>
</xsl:apply-templates>

<xsl:template mode="MyTemplate" match="myroot">
  <xsl:param name="foo"/>
  <xsl:value-of select="$foo/..."/>
  <xsl:value-of select="xpath" />...<xsl:value-of select="/xpath" />
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...