如何将一个XSL页面的全局JavaScript变量值传递到另一个XSL页面?
解决方案:跨XSL传递JS变量并修改内容
首先要明确一个核心逻辑:XSLT是XML转换语言,运行在XML转换阶段(服务器/转换工具);JavaScript是客户端脚本,运行在浏览器中。两者执行时机完全不同——XSLT先执行完生成HTML/XML,JS才会运行。所以不能直接从JS变量给XSLT传值,得根据运行环境选对应方案。
情况1:转换全在浏览器中完成
如果是浏览器里用XML+XSL生成页面,思路是用浏览器存储暂存JS变量,再在第二个页面加载后用JS修改内容:
步骤1:第一个XSL生成的页面中存储JS变量
在第一个页面的createOutPut函数执行后,把outPut存入浏览器本地存储:
// 第一个页面的JS代码里 function createOutPut(){ // 原有的some code if (outPut !== "") { localStorage.setItem("channelOutput", outPut); } }
步骤2:第二个XSL生成页面时加入修改逻辑
修改第二个XSL,保留原有<CANALE>内容的同时,在页面末尾添加一段JS,加载时自动读取存储值并替换内容:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:output method="html" indent="no" omit-xml-declaration="yes" encoding="ISO-8859-1"/> <xsl:param name="chkNode_val"/> <CANALE><xsl:value-of select="//PARM[@name='channel_val']"/></CANALE> <!-- 添加这段JS在页面末尾 --> <script> const savedOutput = localStorage.getItem("channelOutput"); if (savedOutput) { const canaleEl = document.querySelector("CANALE"); if (canaleEl) canaleEl.textContent = savedOutput; } </script> </xsl:stylesheet>
情况2:转换在服务器端完成
如果是后端用XSLT生成页面,需要把客户端的outPut值传到服务器,再作为参数传给第二个XSLT:
步骤1:第一个页面的JS把值传给后端
用AJAX或表单提交把outPut发送到后端接口:
// 第一个页面的JS代码里 if (outPut !== "") { // 示例:用表单提交跳转至第二个页面的生成接口 const form = document.createElement("form"); form.method = "POST"; form.action = "/generate-second-page"; const input = document.createElement("input"); input.type = "hidden"; input.name = "channelOutput"; input.value = outPut; form.appendChild(input); document.body.appendChild(form); form.submit(); }
步骤2:后端把参数传入第二个XSLT
以Java为例(其他后端语言逻辑类似),调用XSLT时设置参数:
TransformerFactory factory = TransformerFactory.newInstance(); Templates template = factory.newTemplates(new StreamSource(new File("second.xsl"))); Transformer transformer = template.newTransformer(); // 把收到的outPut值设为XSLT参数 transformer.setParameter("channelOutput", request.getParameter("channelOutput")); // 执行转换并输出结果 transformer.transform(new StreamSource(xmlInput), new StreamResult(outputStream));
步骤3:修改第二个XSLT判断参数并替换内容
给第二个XSLT新增参数,通过条件判断替换<CANALE>内容:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:output method="html" indent="no" omit-xml-declaration="yes" encoding="ISO-8859-1"/> <xsl:param name="chkNode_val"/> <!-- 新增参数接收outPut的值 --> <xsl:param name="channelOutput"/> <CANALE> <xsl:choose> <!-- 如果参数非空,用参数值 --> <xsl:when test="$channelOutput != ''"> <xsl:value-of select="$channelOutput"/> </xsl:when> <!-- 否则用原有值 --> <xsl:otherwise> <xsl:value-of select="//PARM[@name='channel_val']"/> </xsl:otherwise> </xsl:choose> </CANALE> </xsl:stylesheet>
额外修正
第一个XSL的代码有语法错误:第二行的version="1.0" xmlns:...>应该包裹在<xsl:stylesheet>标签内,正确开头应为:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:math="http://exslt.org/math">
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

