为什么我不能在XSL中使用apply-templates获取参数?

时间:2009-02-26 11:31:08

标签: xslt parameters

我发现无法使用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。请忽略我传递硬编码参数的事实 - 这只是一个例子。

5 个答案:

答案 0 :(得分:5)

嗯...有趣......在.NET中使用XslTransformXslCompiledTransform失败了 - 但看起来应该工作......好奇......

更新问题似乎是 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'