访问 XSL 中的 URL 个参数
Acessing URL parameters in XSL
我想从我的 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>
更新
我正在使用基于 CMS 工具的闭源 portlet。此 portlet 根据其 GUI 配置生成 XML 作为输出。
并且我正在使用 XSL 来显示 output.I 对 portlet 没有任何进一步的控制。
XSLT 本身并不知道它是在网页上下文中执行的,因此您无法直接访问 URL.
但是,您可以将参数传递给 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.
因此,我更新后的示例将变为(假设您的查询字符串参数名为 'trxid'):
<?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 代码和隐藏字段。
我想从我的 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>
更新
我正在使用基于 CMS 工具的闭源 portlet。此 portlet 根据其 GUI 配置生成 XML 作为输出。 并且我正在使用 XSL 来显示 output.I 对 portlet 没有任何进一步的控制。
XSLT 本身并不知道它是在网页上下文中执行的,因此您无法直接访问 URL.
但是,您可以将参数传递给 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.
因此,我更新后的示例将变为(假设您的查询字符串参数名为 'trxid'):
<?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 代码和隐藏字段。