【发布时间】:2010-11-18 21:13:26
【问题描述】:
我的问题在这篇文章的底部,如果你想在完整解释之前阅读它们。
我正在使用 XSL 将 XML 文档转换为漂亮的网页,但无法正确传递变量。我定义了许多xsl:templates,并且需要将特定参数传递给其中一个。我希望我能够传递一个命名参数,该参数可能会被发送到所有xsl:templates,但只能被一个人使用,而被其他人忽略。但是,当我尝试为自己测试时(以及我对 XSL 的有限了解),我根本无法传递参数,更不用说测试它是否意外地干扰了任何其他 xsl:templates。
以下是简化的示例代码(为这个问题输入的,它可能包含一个或两个错字)。我定义了许多不同的xsl:templates 来处理 XML 中的节点,并且到目前为止一切正常。我似乎在向这些模板添加参数时遇到了问题。
XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="main.xsl"?>
<wrapperNode>
<testNode>
<subNode/>
</testNode>
</wrapperNode>
main.xsl:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="test.xsl"/>
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates>
<xsl:with-param name="testParam">TEST_PARAMETER</xsl:with-param>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
test.xsl:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="testNode">
<xsl:param name="testParam" />
TEST1
<xsl:value-of select="$testParam" />
TEST2
</xsl:template>
</xsl:stylesheet>
输出(实际):
TEST1 TEST2
输出(预期/期望):
TEST1 TEST_PARAMETER TEST2
我的问题:
是否可以发送一个命名的 我所有的参数
xsl:templates 使用xsl:apply-templates与xsl:with-param,但选择这个 值具体由name=内 实际的模板,以便它可以 被明确地用在一个单一的 模板并被所有其他人忽略 (即使我想添加其他, 名称不同,参数为 其他模板稍后)?我当前的示例代码做错了什么,它似乎根本没有收到参数?
有没有更好的方法来做到这一点?
编辑:我想明确指出,由于test.xsl:testNode 模板中的其他输出,我确定它IS成功叫。 ONLY 参数部分不起作用。我并不是要浪费人们的时间来弄清楚为什么没有调用该模板。是的。
更新:在回应我最初收到的答案时,指出我编的例子并不完全正确(我的错误)并且没有很清楚地表明问题(即:正确的模板 is 被调用,但 only 参数似乎不起作用),我已经用更好的示例替换了示例。这个例子更清楚地表明testNode 模板被成功调用,但参数似乎没有被传递。在考虑这个问题的先前答案之前和之后,我已经测试了很多次。我完全被难住了,因为从我在其他地方读到的内容和人们迄今为止的建议来看,一切似乎都是正确的。
【问题讨论】:
-
由于@Jim Garrison 拥有answer,您不能将空命名空间URI 元素作为样式表的顶部元素。您的 XSLT 处理器应该抛出错误消息。
-
好问题,+1。有关您问题的具体答案,请参阅我的回复。
-
我用更准确和具体的例子更新了这个问题。我很抱歉首先有一个不太完美的例子,我是在动态创建它并且放错了一些东西(比如 Jim 指出的 HTML 标签)。
标签: xslt parameters stylesheet apply-templates