我在Java中使用XSLT Transformer。我确信问题出在我输入XSLT语法的方式。
基本上,我必须看看XML的一个节点中的属性“id”是否等价于一个值,XSL应该处理一个模板。我需要将此测试值作为xsl:param传递。当我在静态值上测试时,它很酷:
<ul class="levelOneNav">
<xsl:for-each select="level1[@id='sub-page-1']">
<xsl:call-template name="level1"/>
</xsl:for-each>
<div class="clear"></div>
</ul>
测试部分位于上面的第二行。 AFAIK在字符串中放入一个参数,格式为<xsl:for-each select="level1[@id='$ContentID']">
,其中$ContentID
是声明为<xsl:param name="ContentID"/>
的xsl:param
所以这就是我正在键入的代码
<ul class="levelOneNav">
<xsl:for-each select="level1[@id='$ContentID']">
<xsl:call-template name="level1"/>
</xsl:for-each>
<div class="clear"></div>
</ul>
但它不起作用。我也试过使用<xsl:for-each select="level1[@id='{$ContentID}']">
它也失败了。
任何建议都非常感谢。如果你觉得我应该学点东西,请给我链接。谢谢你的时间......
答案 0 :(得分:1)
不,那个“AFAIK”就是你错的地方。 XSLT属性中的某些字符串值肯定会接受"{$param}"
语法(请注意大括号),但在您的情况下,您所遵循的内容要简单得多:@id=$ContentID
编辑:请注意,'{$ param}'适用于 XSLT属性,请参阅示例:
<xsl:element name="{$namespace}:{$elementName}">
<xsl:attribute name="{$attrName}"><xsl:value-of select="$value"/></xsl:attribute>
</xsl:element>
答案 1 :(得分:0)
试
<ul class="levelOneNav">
<xsl:variable name="contentID" select="'sub-page-1'" />
<xsl:for-each select="level1[@id=$ContentID]">
<xsl:call-template name="level1"/>
</xsl:for-each>
<div class="clear"></div>
</ul>
变量或参数将以相同的方式工作。
因为你必须删除$ContentID
周围的简单引用。
如果level1/@id
是唯一的,那么你不需要foreach。
下面的例子,将变量作为参数发送。
<ul class="levelOneNav">
<xsl:variable name="contentID" select="'sub-page-1'" />
<xsl:for-each select="level1[@id=$ContentID]">
<xsl:call-template name="level1" >
<xsl:with-param name="foo" select="$ContenID" />
</xsl:call-template>
</xsl:for-each>
<div class="clear"></div>
</ul>