过去几天我花了很多时间研究消息,寻找将参数从URL传递到XSL样式表的方法。
例如,我有一个当前网址,如:
http://localhost/blocableau/data/base_bloc/blocableau3x.xml?95.2
我想在之后选择值?与此示例中的95.2
一样,并将其放在变量var_massif
。
我用javascript尝试了以下代码来测试值substring(1)但是使用xsl它没有工作。
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" />
<!-- recherche des cotations par Massif selon une variable -->
<xsl:key name="byMassif" match="bloc" use="Massif" />
<xsl:template match="BLOCS">
<script>var requete = location.search.substring(1);
mavariable=requete;alert(mavariable);x=mavariable</script>
<xsl:variable name="var_massif"><xsl:value-of select="95.2" /></xsl:variable>
<span>Ma variable xsl est : <xsl:value-of select="$var_massif"/></span>
<div style="position:relative; top:0px;left:10px;font-family: Arial, 'Helvetica Neue', 'Helvetica, sans-serif'; font-size:12px;z-index:1;">
<!-- genere un id pour chaque valeur de cotation et mise en forme -->
<xsl:for-each select="bloc[generate-id() = generate-id(key('byMassif', $var_massif)[1])]" >
<xsl:sort select="Massif" />
答案 0 :(得分:0)
我假设您正在加载一个使用XSL处理指令转换文件的XML:
<?xml-stylesheet ... ?>
您需要阅读URL并提取查询字符串。不幸的是它没有自动映射。唯一的方法是使用document-uri(/)
,但它是XSLT 2.0,不支持浏览器。
在XSLT 1.0中,您必须将HTTP请求指向您要处理的XML文件,而不是指向将使用XSLTProcessor
加载XML和XSLT的脚本。然后,您可以将查询字符串作为参数传递给处理器:
var var_massif = location.search.substring(1); // gets the string and removes the `?`
var processor = new XSLTProcessor(); // starts the XSL processor
processor.setParameter(null, "var_massif", var_massif); // sets parameter
... // load XSL, XML and transformToDocument
在XSLT样式表中,您应该有一个全局参数变量:
<xsl:param name="var_massif" />
然后您可以使用$var_massif
阅读。
UPDATE 以下是使用JQuery的分步示例:
我正在使用这个简化的样式表,只是为了向您展示如何获取参数。它位于我称为stylesheet.xsl
的文件中:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" />
<xsl:param name="var_massif" />
<xsl:template match="BLOCS">
<span>Ma variable xsl est : <xsl:value-of select="$var_massif" /></span>
</xsl:template>
</xsl:stylesheet>
此输入(blocableau3x.xml
)位于同一目录中:
<BLOCS>
<bloc>
<Massif></Massif>
</bloc>
</BLOCS>
现在也在同一目录中创建此HTML文件(blocableau3x.html):
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.0/jquery.js"></script>
<script>
$( document ).ready(function() {
var var_massif = location.search.substring(1); // gets the string and removes the `?`
var body = $("body")[0]; // gets the body element where the result will be inserted
if (var_massif) {
var processor = new XSLTProcessor(); // starts the XSL processor
processor.setParameter(null, "var_massif", var_massif);
var source;
var xslReq = $.get("stylesheet.xsl", function (data) { // loads the stylesheet
processor.importStylesheet(data);
});
var xmlReq = $.get("blocableau3x.xml", function (data) { // loads the xml
source = data;
});
$.when(xslReq, xmlReq).done(function () { // waits both to load
var result = processor.transformToDocument(source); // transforms document
body.appendChild(result.documentElement); // adds result as child of body element
});
} else {
body.html("<h1>Missing query string</h1>"); // in case there is no query string
}
});
</script>
<html>
<body></body>
</html>
不是在URL中调用XML文件,而是调用HTML文件。加载时,它将加载XSL文件和XML文件,并使用XSL处理器处理该文件。它将能够读取查询参数并将其作为XSL全局参数传递,您可以在XSLT文件中读取该参数。