XSLT: разрешить пути в шаблоне / относительно шаблона - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть шаблон

<xsl:template name="template">
<xsl:param name="param"/>
</xsl:template>

, который я вызываю с помощью

<xsl:call-template name="template">
<xsl:with-param name="param" select="."/>
</xsl:call-template>

Это разрешает содержимое. в строку, и передает их в шаблон.

Однако, это решает. относительно шаблона вызова. Если я изменю контекст в шаблоне, как я могу разрешить параметр в шаблоне относительно нового контекста?


Пример добавлен согласно запросу:

<xsl:template name="template">
    <xsl:param name="param1"/>
    <xsl:param name="param2"/>
    <xsl:for-each select="$param1">
        <xsl:value-of select="func:Lookup($param2)"/>
    </xsl:for-each>
</xsl:template>

<xsl:call-template name="template">
    <xsl:with-param name="param1" select="element"/>
    <xsl:with-param name="param2" select="."/>
</xsl:call-template>

где param1 и param2 - относительные xpath.

Я хочу передать оба относительных xpath в шаблон, а затем разрешить их. <xsl:for-each select="$param1"> должен разрешить некоторые элементы, а затем . должен разрешиться относительно каждого элемента. $ param2 должен быть разрешен относительно $ param1.

Но то, что на самом деле происходит, оба решаются относительно вызова шаблона. Это нормально для param1, но не для param2.

Если бы не каждый, я мог бы передать element/. как param2. Но это не сработает из-за каждого.

1 Ответ

0 голосов
/ 03 апреля 2012

Значение параметра на самом деле является узлом (текущим узлом), а не строкой, но вы правы, что (как и в большинстве языков) параметр содержит значение, а не фрагмент синтаксиса.Если вам действительно нужно передать строку (или, более часто, фрагмент xpath, извлеченный из источника), вам понадобится расширение динамической оценки, такое как аксон: оценивать, многие, но не все, продукты имеют такое расширение.Если требование простое (например, имя элемента), а не произвольный xpath, вы можете передать строку, например

 <xsl:with-param name="paaram2" select="'foo'"/>

, затем использовать ее как

<xsl:value-of select="func:Lookup(*[name()=$param2])"/>

, которая пропустит элемент <foo/> к функции.

Здесь, читая выражение изнутри

 *

выбирает все дочерние элементы текущего узла

name()

, затем возвращаетимя этого элемента, поэтому

[name()=$param2]

верно только для тех дочерних элементов, имя которых указано в параметре, поэтому

*[name()=$param2]

выбирает элементы с именем, указанным параметром, и

func:Lookup(*[name()=$param2])

применяет функцию расширения к этим элементам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...