Почему я не могу получить параметры для работы с apply-шаблонами в XSL? - PullRequest
6 голосов
/ 26 февраля 2009

Я считаю невозможным заставить с-param работать с apply-шаблонами. В качестве примера я взломал примеры, приведенные в w3schools .

XSL

<xsl:template match="/">
  <xsl:apply-templates>
    <xsl:with-param name="test" select="'has this parameter been passed?'"/>
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="cd">
  <xsl:param name="test"></xsl:param>
  parameter:
  <xsl:value-of select="$test"></xsl:value-of>
</xsl:template>

XML

<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
  </cd>
</catalog>

(Надеюсь) вы увидите, что тестовый параметр не передается в шаблон cd. Я могу заставить его работать, используя call-template, но не apply-templates. В чем дело? Я использую XSL 1.0. Пожалуйста, игнорируйте тот факт, что я передаю жестко запрограммированный параметр - это всего лишь пример.

Ответы [ 5 ]

5 голосов
/ 26 февраля 2009

Хммм ... интересно ... мне не удается использовать XslTransform и XslCompiledTransform в .NET - но похоже, что должно работать ... любопытно ...

обновление проблема, похоже, состоит в совпадении root ; попробовать

<xsl:template match="/catalog"> <!-- CHANGE HERE --> 
  <xsl:apply-templates>
    <xsl:with-param name="test" select="'has this parameter been passed?'"/>
  </xsl:apply-templates>
</xsl:template>

Тогда это работает для меня без каких-либо других изменений. Разница в том, что вы соответствовали корневому узлу. Когда вы применили свои «шаблоны», они каскадно сначала попадают в каталог (с параметром), , затем на CD (без параметра). Чтобы получить то, что вы хотите, вам нужно начать с каталога. Вы можете увидеть это, добавив <xsl:vaue-of select="name()"/> к совпадению, а затем попробуйте использовать его как "/" и "/catalog".

2 голосов
/ 09 июня 2011

вы всегда можете пойти с xsl: call-template .. например:

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

<xsl:template name="foo">
   <xsl:param name="bars"/>
   <xsl:value-of select="$node"/>
</xsl:template>
2 голосов
/ 26 февраля 2009

Попробуйте указать шаблоны для применения:

<xsl:template match="/">
  <xsl:apply-templates select="catalog/cd">
    <xsl:with-param name="test" select="'has this parameter been passed?'"/>
  </xsl:apply-templates>
</xsl:template>
0 голосов
/ 06 марта 2009

Я вижу, проблема в том, что для элемента cd в корневом каталоге нет соответствия. Под root у вас есть элемент catalog , а не элемент cd , поэтому измените шаблон так, чтобы он соответствовал = 'catalog'

0 голосов
/ 26 февраля 2009

У меня работает с libxslt 1.1.24 от http://xmlsoft.org/XSLT/ :

$ xsltproc xml1.xsl xml1.xml
<?xml version="1.0"?>


  parameter:
  has this parameter been passed?

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