Передача локальной переменной из одного шаблона в другой в xslt - PullRequest
0 голосов
/ 12 июня 2018

Мне нужно передать значение локальной переменной, определенной в одном шаблоне, в другой шаблон.

Следующий источник не работает (т.е. я не могу передать локальную переменную в другой шаблон).В чем дело ?Заранее большое спасибо.

   `        <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="text"/>

      <xsl:template match="/">
        <xsl:apply-templates select="A/B/C">
        </xsl:apply-templates>
        <xsl:apply-templates select="A/B/D/E/F">
          <xsl:with-param name="XYZ" select="$XYZ" >
          </xsl:with-param>
        </xsl:apply-templates>
      </xsl:template>

      <xsl:template match="A/B/C">
        <xsl:variable name="XYZ">
          <xsl:value-of select="K/L/M/N/O"/>
        </xsl:variable>
      </xsl:template>

      <xsl:template match="A/B/D/E/F">
        <xsl:text>BLAH-BLAH-BLAH-111</xsl:text>
        <xsl:value-of select="$XYZ" />
        <xsl:text>BLAH-BLAH-BLAH-999</xsl:text>
      </xsl:template>
    </xsl:stylesheet>`

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

То, что, по-видимому, делает ваш нерабочий код:

  • A вызывает B
  • B устанавливает локальную переменную $ XYZ
  • A вызывает C
  • Вы хотели бы, чтобы C имел доступ к $ XYZ

Проблема не в передаче параметра из A в C: это просто.Проблема заключается в возврате значения $ XYZ из B вызывающей стороне A.

Способ сделать это зависит от используемой версии XSLT.

  • InXSLT 1.0, единственное, что вы можете вернуть из шаблона, это кусок XML.Шаблон B должен обернуть все, что он хочет вернуть во фрагмент XML, шаблон A должен зафиксировать этот фрагмент XML в переменной.Чтобы быть полезным, необходимо расширение exslt: node-set () для преобразования фрагмента XML в набор узлов, из которого он может извлекать необходимые ему части.

  • InXSLT 2.0, дополнительная опция - возвращать последовательность вещей (например, XML-узлы) из шаблона: вызывающая сторона может, например, скопировать первый элемент в этой последовательности в результат преобразования и передать второй элемент в последовательностив другой шаблон для дальнейшей обработки.

  • В XSLT 3.0 вы можете использовать карту вместо последовательности, поэтому различные вещи в результате определяются по имени, а не по положению.

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

0 голосов
/ 12 июня 2018

Вам необходимо объявить параметр с помощью xsl:param в соответствующем шаблоне

<xsl:template match="A/B/D/E/F">
    <xsl:param name="XYZ" />
    <xsl:text>BLAH-BLAH-BLAH-111</xsl:text>
    <xsl:value-of select="$XYZ" />
    <xsl:text>BLAH-BLAH-BLAH-999</xsl:text>
  </xsl:template>

Однако существует проблема с вашим блоком кода, который выбирает этот шаблон

 <xsl:apply-templates select="A/B/D/E/F">
    <xsl:with-param name="XYZ" select="$XYZ" >
 </xsl:with-param>

xsl:with-param выбирает имя переменной XYZ для передачи в качестве параметра, но эта переменная не существует в шаблоне.Возможно, вы ожидаете, что он будет использовать переменную, определенную в шаблоне, соответствующем «A / B / C»?Этого не произойдет, потому что переменные являются локальными по объему для блока, в котором они объявлены.

Возможно, вам нужно написать свой XSLT следующим образом:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:variable name="XYZ">
      <xsl:apply-templates select="A/B/C" />
    </xsl:variable>
    <xsl:apply-templates select="A/B/D/E/F">
      <xsl:with-param name="XYZ" select="$XYZ" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="A/B/C">
      <xsl:value-of select="K/L/M/N/O"/>
  </xsl:template>

  <xsl:template match="A/B/D/E/F">
    <xsl:param name="XYZ" />
    <xsl:text>BLAH-BLAH-BLAH-111</xsl:text>
    <xsl:value-of select="$XYZ" />
    <xsl:text>BLAH-BLAH-BLAH-999</xsl:text>
  </xsl:template>
</xsl:stylesheet>

Когда вы применяете его кэтот XML

<A>
  <B>
    <C>
      <K>
        <L>
          <M>
            <N>
              <O> *** Parameter *** </O>
            </N>
          </M>
        </L>
      </K>
    </C>
    <D>
      <E>
        <F>Test</F>
      </E>
    </D>
  </B>
</A>

Ниже выводится

BLAH-BLAH-BLAH-111 *** Parameter *** BLAH-BLAH-BLAH-999
...