Эквивалент для переменной с выражением выбора и непустым содержимым в XSLT 1.0 - PullRequest
2 голосов
/ 06 августа 2010

У меня есть один шаблон (который я не могу изменить, но должен использовать), который обрабатывает текущий выбранный узел, он может выглядеть так (сильно упрощенно):

<xsl:template name="foreignTemplate">
    <xsl:value-of select="." />
</xsl:template>

В XSLT 2.0 я мог сделать что-то вроде этого, чтобы связать "." в этом шаблоне к произвольной переменной:

<xsl:template match="dummyNode">
    <xsl:variable name="inputString">foobar</xsl:variable>
    <xsl:variable name="result" select="$inputString">
        <xsl:call-template name="foreignTemplate" />
    </xsl:variable>
</xsl:template>

Учитывая этот исходный документ:

<?xml version="1.0"?>
<dummyNode>DUMMY TEXT</dummyNode>

применение вышеупомянутого преобразования с процессором XSLT 2.0 будет означать "foobar".

Однако в XSLT 1.0 xsl: variable-Elements не может иметь атрибута select и быть непустым одновременно. Как я могу достичь того же результата в XSLT 1.0?

Ответы [ 3 ]

1 голос
/ 06 августа 2010

в XSLT 1.0 xsl: variable-Elements не может иметь атрибут выбора и быть непустое в то же время

Во-первых, то же самое верно для XSLT 2.0 (и для каждой инструкции, которая имеет @select и допускает конструктор последовательности в XSLT 2.0)

Во-вторых, если вы хотите изменить узел контекста (или элемент контекста в XSLT 2.0) перед вызовом шаблона имени, вы должны сделать:

<xsl:for-each select="$here-the-context-you-want"> 
    <xsl:call-template name="foreignTemplate" /> 
</xsl:for-each> 
1 голос
/ 06 августа 2010

В XSLT 2.0 я мог бы сделать что-то вроде это связать "." в этом шаблоне произвольная переменная:

<xsl:template match="dummyNode"> 
    <xsl:variable name="inputString">foobar</xsl:variable>

    <xsl:variable name="result" select="$inputString"> 
        <xsl:call-template name="foreignTemplate" /> 
    </xsl:variable> 
</xsl:template>

Это не так .

Как в XSLT 1.0, так и в 2.0 * <xsl:variable> может иметь атрибут select или тело (конструктор последовательности), но наличие обоих одновременно является ошибкой.

Из XSLT 2.0 spec : "[ERR XTSE0620] Статическая ошибка, если элемент привязки переменной имеет атрибут select и имеет непустое содержимое".

Я бы порекомендовал следующий стиль письма:

В XSLT 1.0 : не полагаться на узел контекста в качестве неявного параметра. Используйте явные параметры:

<xsl:template name="foreignTemplate">  
  <xsl:param name="pElement" />
  <xsl:value-of select="$pElement" />       
</xsl:template>

и в другом шаблоне назовите это так:

<xsl:call-template name="foreignTemplate">
 <xsl:with=param name="pElement" select="someExpression"/>
</xsl:call-template>

В XSLT 2.0: Используйте <xsl:function> вместо <xsl:template>:

<xsl:function name="my:foo" as="xs:string">
  <xsl:param name="pElement" as="element()"/>

  <xsl:sequence select="string($pElement)"/>
</xsl:function>

и называть это как часть любого выражения XPath:

  my:foo(someElement)
0 голосов
/ 06 августа 2010

Чтобы применить шаблон к константной строке, вы можете использовать набор узлов, который содержится в вашей таблице стилей, и получить к нему доступ с помощью функции document. С пустой строкой в ​​качестве параметра результатом будет сам документ таблицы стилей.

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="/2728435/ekvivalent-dlya-peremennoi-s-vyrazheniem-vybora-i-nepustym-soderzhimym-v-xslt-1-0">
    <xsl:output method="xml" indent="yes" encoding="utf-8" />

    <foo:data>foobar</foo:data>

    <xsl:template name="foreignTemplate">
        <xsl:value-of select="." />
    </xsl:template>

    <xsl:template match="/">
        <xsl:for-each select="document('')/xsl:stylesheet/foo:data">
            <xsl:call-template name="foreignTemplate" />
        </xsl:for-each>
    </xsl:template>

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