在XSL中访问URL参数

时间:2015-02-19 05:20:23

标签: javascript xml xslt xpath xslt-2.0

我想从我的XSL中的当前页面URL获取URL参数,并使用它来测试模板xpath中的条件。 例如:

<xsl:apply-templates select="//search-results/orders/order[@id = URL Parameter]"  mode="tableContent"/>

我无法控制正在使用的工具生成的XML。

我尝试使用JavaScript从URL获取参数并将其保存在XSL中的js变量中,但是无法继续在xpath条件上获取此变量值。 不确定我是否采用了正确的方法。

@dariom: 我将URL参数存储在同一页面的输入字段中,然后在下面的js代码中获取该值

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="UTF-8"/>

    <xsl:template match="/">

        <script language = "javascript">
            $( document ).ready(function() {
            var trxid = document.getElementById("tempField").value;
            console.log("trxid");
            console.log(trxid);
            });
        </script>


        <textarea><xsl:copy-of select="*"/></textarea>  
        <input type="hidden" id="countValue" class="countValue" value="{search-results/size}"/> 

        <xsl:apply-templates select="//search-results/orders/order[@id = trxid ]"/>
    </xsl:template>
</xsl:stylesheet>

更新

我正在使用基于闭源的基于portlet的CMS工具。此portlet根据其GUI配置生成XML作为输出。 并且我使用XSL来显示输出。我没有对portlet的任何进一步控制。

1 个答案:

答案 0 :(得分:2)

XSLT本身并不知道它是在网页的上下文中执行的,因此您无法直接访问网址。

但是,您可以将参数传递给XSLT,这听起来就像您正在做的那样。你能添加JavaScript代码和XSLT的例子吗?根据您所描述的内容,您需要使用<xsl:param />元素而不是<xsl:variable />元素。

<强>更新

根据您添加的代码,看起来XSLT正在生成一个内置JavaScript的HTML页面。问题是你的JavaScript在之后运行 XSLT已经创建了它的输出。您无法在XSLT中使用trxid JavaScript变量的值,因为它尚未定义(并且您无法将XSLT和JavaScript混合在一起)。

要实现您需要做的事情,您需要将URL参数值传递到XSLT处理器(假设它支持此功能),创建一个<xsl:param>元素以包含参数的值和然后你可以在XPath表达式中使用该参数。

类似的东西:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    ...
    <!-- defintion of your XSLT parameter. Note this has a global scope -->
    <xsl:param name="trxid" />
    ...
    <!-- usage of your XSLT parameter. Note the '$' prefix -->
    <xsl:apply-templates select="//search-results/orders/order[@id = $trxid ]"/>
    </xsl:template>
</xsl:stylesheet>

关键是要弄清楚如何调用XSLT处理器并为其提供参数值。我建议您更新答案,详细说明您正在编码的语言以及您正在使用的XSLT处理器。

<强>更新

我已经搜索了有关Unify的更多信息。我不知道我发现的信息是否适合您的上下文(似乎Unify中有许多模块),但这似乎是您之后的事情:request parameters in XSL

因此,我的更新示例将成为(假设您的查询字符串参数名为&#39; trxid&#39;):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    ...
    <xsl:param name="request_trxid" />
    ...
    <!-- usage of your XSLT parameter. Note the '$' prefix -->
    <xsl:apply-templates select="//search-results/orders/order[@id = $request_trxid]"/>
    </xsl:template>
</xsl:stylesheet>

如果此方法有效,则无需添加JavaScript代码和隐藏字段。