如果你想在完整的解释之前阅读它们,我的问题就在这篇文章的底部.
我正在使用XSL将XML文档转换为漂亮的网页,并且无法正确传递变量.我xsl:template
定义了很多,并且需要将特定参数传递给其中一个.我希望我能够传递一个命名参数,该参数可能被发送到所有xsl:template
s,但只能被一个人使用而被其他人忽略.然而,当我试图为自己测试这个(以及我对XSL的有限理解)时,我根本无法传递参数,更不用说测试它是否意外地干扰了任何其他xsl:template
的.
以下是简化的示例代码(为此问题键入,可能包含一两个错字).我有很多不同xsl:template
的定义来处理XML中的节点,到目前为止一切都运行良好.在为这些模板添加参数时,我似乎遇到了问题.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="main.xsl"?>
<wrapperNode>
<testNode>
<subNode/>
</testNode>
</wrapperNode>
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
TEST1 TEST2
Run Code Online (Sandbox Code Playgroud)
TEST1 TEST_PARAMETER TEST2
Run Code Online (Sandbox Code Playgroud)
我对此有疑问:
是否可以xsl:template
使用xsl:apply-templates
with
向我的所有s
发送命名参数
xsl:with-param
,但name= …
我看过很多帖子都做了这样的事情,这让我觉得这是可能的,我只是做错了什么.我尽可能简化了它,试图弄清楚为什么会发生这种情况:
继承人我的xml(没什么好激动的):
<?xml version="1.0" encoding="UTF-8"?>
<REPORT>
</REPORT>
Run Code Online (Sandbox Code Playgroud)
这是我的xsl:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="REPORT">
<xsl:variable name="tryThisTemplate">
<xsl:call-template name="TRY_THIS"/>
</xsl:variable>
<TEST1>
<xsl:call-template name="TRY_THIS"/>
</TEST1>
<TEST2>
<xsl:value-of disable-output-escaping="yes" select="$tryThisTemplate" />
</TEST2>
<TEST3>
<xsl:value-of select="$tryThisTemplate" />
</TEST3>
</xsl:template>
<xsl:template name="TRY_THIS">
<MY_NODE desc="my description" />
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
<?xml version="1.0" encoding="utf-8"?>
<TEST1>
<MY_NODE desc="my description"/>
</TEST1>
<TEST2></TEST2>
<TEST3></TEST3>
Run Code Online (Sandbox Code Playgroud)
这是我的问题:为什么TEST2和TEST3不起作用.$ tryThisTemplate变量似乎为空.我在这里误解了什么.我应该以不同的方式做这件事吗?