我发现无法使用with-param来处理apply-templates。举个例子,我已经破解了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。请忽略我传递硬编码参数的事实 - 这只是一个例子。
答案 0 :(得分:5)
嗯...有趣......在.NET中使用XslTransform
和XslCompiledTransform
失败了 - 但看起来应该工作......好奇......
更新问题似乎是 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”。
答案 1 :(得分:2)
尝试指定要应用的模板:
<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>
答案 2 :(得分:2)
你可以随时使用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>
答案 3 :(得分:0)
来自http://xmlsoft.org/XSLT/的libxslt 1.1.24适用于我 :
$ xsltproc xml1.xsl xml1.xml
<?xml version="1.0"?>
parameter:
has this parameter been passed?
parameter:
has this parameter been passed?
答案 4 :(得分:0)
我发现问题是root下的 cd 元素不匹配。在root下你有目录元素而不是 cd 元素,所以修改模板匹配='catalog'