为xsl:为每个分配参数值

时间:2009-10-22 06:45:34

标签: xslt foreach parameters

任何使用XSLT的人都可以帮助我吗?

我使用的是XSL 1.0版。

我在XSL文件中声明了一个参数,如:

<xsl:param name="HDISageHelpPath"/>

现在我从asp页面为此参数赋值。我指定的值是"document('../ChannelData/Sage/help/ic/xml/HDI.xml')/HelpFiles/Help"。现在我想将此参数分配给<xsl for each>,如

<xsl:for-each select="msxsl:node-set($HDISageHelpPath)" >(这不起作用)

但它不起作用。我通过调试它来检查参数值,如下所示

<debug tree="$HDISageHelpPath">
    <xsl:copy-of select="$HDISageHelpPath"/>
</debug>

我可以打印该值,看起来是正确的。事实上,当我通过硬编码分配静态路径("document('../ChannelData/Sage/help/ic/xml/HDI.xml')/HelpFiles/Help")时,它可以正常工作

<xsl:for-each select="document('../ChannelData/Sage/help/ic/xml/HDI.xml')/HelpFiles/Help"> (This works)

任何人都可以告诉我为什么将参数分配给xsl:for-each不起作用?

注意:我引用了网站“http://www.dpawson.co.uk/xsl/sect2/N1553.html

1 个答案:

答案 0 :(得分:0)

您无法在XSLT 1.0中轻松地将动态字符串评估为XPath表达式。它们通常必须是硬编码的。

EXSLT's dyn:evaluate(),但我怀疑你可以在MXSML处理器上使用它。

作为替代方法,您可以尝试仅传递文件路径:

<xsl:param name="HDISageHelpFilePath"/>
<!-- ... -->
<xsl:for-each select="document($HDISageHelpFilePath)/HelpFiles/Help">
</xsl:for-each>

或制作占位符,在将实际的XSL代码加载到处理器(作为字符串)之前将其替换为搜索和替换。这有点混乱且容易出错,但它可以让您使用实际的动态XPath表达式。

<xsl:for-each select="%HELP_FILE_XPATH%">
</xsl:for-each>

将文件加载为文本,将%HELP_FILE_XPATH%替换为实际的XPath,将其提供给处理器。如果它加载,你很好,如果没有,你的输入XPath格式不正确。