Есть ли ярлык для вызова однопараметрических функций XSL? - PullRequest
2 голосов
/ 30 июня 2011

У меня есть много функций, которые принимают один вход, например ::1001

<xsl:template name="F">
    <xsl:param name="input"/>
    ... ...
</xsl:template>

Для вызова функции мне нужно написать:

<xsl:call-template name="F">
    <xsl:with-param name="input" select="'jkljkljkl'"/>
</xsl:call-template>

Это кажется слишком многословным. Поскольку функция имеет только один параметр, почему мы должны писать узел xsl:with-param?

Есть ли ярлык для вызова однопараметрических функций?

Я хочу иметь возможность сделать что-то вроде этого:

<xsl:call-template name="F" select-param="'jkljkl'"/>

Он короткий и приятный и одинаково не двусмысленный (поскольку есть только один параметр) Как мы можем вызвать однопараметрические функции коротким и приятным способом?

Ищу решение как в XSLT 1.0, так и в XSLT 2.0.

Ответы [ 2 ]

5 голосов
/ 30 июня 2011

В XSLT 2.0 вы можете написать свои собственные функции с помощью:

  • объявление вашего пространства имен
  • определение функции как дочернего элемента корневого элемента преобразования с использованием объявления xsl:function.

Пример:

<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:nTan="http://nTan.comr">

  <xsl:function name="nTan:Hello">
   <xsl:param name="string1"/>
    <xsl:value-of select="concat('Hello ',$string1)"/>
  </xsl:function>

  <xsl:template match="/">
    <xsl:value-of select="nTan:Hello('World!')"/>
  </xsl:template>

</xsl:stylesheet>
1 голос
/ 30 июня 2011

Вы не можете этого сделать, однако стоит отметить, что когда вы вызываете именованный шаблон, контекстный узел не меняется.В зависимости от контекста, вы можете иметь доступ к именованному шаблону, который будет передаваться в качестве параметра напрямую.

Также возможно иметь параметр, который устанавливает текущий узел контекста в качестве значения по умолчанию, так что вы можете вызывать его без параметра для ссылки на текущий узел или, необязательно, передать узел.

Например, с помощью ввода:

<foo>
  <input>xxx</input>
</foo>

Вместо этого:1008 *

<xsl:template match="foo">
  <xsl:call-template name="bar">
    <xsl:with-param name="myparam" select="input" />
  </xsl:call-template>
</xsl:template>

<xsl:template name="bar">
  <xsl:param name="myparam" />
  <xsl:value-of select="concat('Value:',$myparam)" />
</xsl:template>

Вы можете просто сделать

<xsl:template match="input">
  <xsl:call-template name="bar" />
</xsl:template>

<xsl:template name="bar">
  <xsl:param name="myparam" select="." />
  <xsl:value-of select="concat('Value:',$myparam)" />
</xsl:template>

В обоих случаях $myparam будет узлом input.Шаблон foo в первом примере также отлично подходит для именованного шаблона bar во втором;при передаче значения параметру оно переопределяет значение по умолчанию, указанное в атрибуте select узла шаблонов <xsl:param>.

...