Мои вопросы по этому поводу:
- Можно ли отправить именованный параметр всем моим xsl: шаблонам, используя xsl: apply-templates с xsl: with-param, но выберите это значение специально по имени = в фактическом шаблоне, чтобы его можно было явно использовать в одном шаблоне и игнорировать все остальные (даже если позже я хотел добавить другие параметры с другими именами для других шаблонов)?
Да .В XSLT 2.0 можно использовать так называемые «параметры туннеля», но в XSLT 1.0 это способ , чтобы некоторые параметры достигли некоторого удаленного шаблона в цепочке.
Другим способом является использование глобальных параметров , чтобы их не пришлось пропускать через каждый шаблон в цепочке.
.2.Что я делаю не так с моим текущим примером кода, который, кажется, не получает параметр вообще?
Причина в коде, который вы нам не показали ,Или, может быть, исходный XML-документ, который у вас есть в вашем реальном деле, отличается от того, который представлен здесь.Я запустил предоставленный код и вообще не смог воспроизвести проблему - получен желаемый результат.
Я предполагаю, что перед шаблоном, который соответствует testNode
, выбран какой-то другой шаблон. Этот шаблон ничего не знает о переданном параметре и не передает его шаблонам, которые он, в свою очередь, применяет.Таким образом, параметр вообще не передается в шаблон, соответствующий testNode
.
. Я предполагаю, что если вы замените:
<xsl:apply-templates>
<xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
</xsl:apply-templates>
на
<xsl:apply-templates select="testNode">
<xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
</xsl:apply-templates>
, выможет получить желаемый результат.
Кроме того, вы можете отследить с помощью отладчика XSLT (например, в Visual Studio) и посмотреть, какой именно шаблон выбран.
.3.Есть ли лучший способ сделать это?
Как я уже говорил, глобальные параметры можно использовать в качестве альтернативы - хотя я не уверен, что это лучше.
Наконец , вот код, который я запустил, который не может воспроизвести вашу проблему:
Таблица стилей XSLT :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
This is text1
<xsl:apply-templates>
<xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
</xsl:apply-templates>
This is text2
</xsl:template>
<xsl:template match="testNode">
<xsl:param name="testParam" />
<xsl:value-of select="$testParam" />
</xsl:template>
</xsl:stylesheet>
XML-документ :
<?xml-stylesheet type="text/xsl" href="main.xsl"?>
<testNode>
<subNode/>
</testNode>
Результат :
This is text1
TEST_PARAMETER
This is text2
ОБНОВЛЕНИЕ:
ОП предоставил более точную информациючто доказывает мое предположение.
Теперь очевидно, что проблема вызвана тем, что для wrapperNode
был выбран встроенный шаблон XSLT для узла элемента.Этот шаблон, естественно, не знает ни о каких параметрах и не использует параметр testParam
, а также не пропускает этот параметр.Таким образом, <xsl:apply-templates/>
во встроенном шаблоне приводит к тому, что соответствующий шаблон testNode
выбирается без передачи ему какого-либо параметра.Это объясняет сообщаемое поведение / результат.
Решение : Решение состоит в том, чтобы указать шаблон, соответствующий wrapperNode
, который принимает параметр с именем testParam
и передает его при применении шаблонов:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates>
<xsl:with-param name="testParam" select="'TEST_PARAMETER'"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="testNode">
<xsl:param name="testParam" />
TEST1
<xsl:value-of select="$testParam" />
TEST2
</xsl:template>
<xsl:template match="wrapperNode">
<xsl:param name="testParam" />
<xsl:apply-templates>
<xsl:with-param name="testParam" select="$testParam"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
Теперь, когда это преобразование применяется к предоставленному XML-документу, получается ожидаемый результат :
<html>
<body>
TEST1
TEST_PARAMETER
TEST2
</body>
</html>