将参数从URL传递到XSL样式表

时间:2014-03-15 11:11:45

标签: url xslt

过去几天我花了很多时间研究消息,寻找将参数从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" />

1 个答案:

答案 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文件中读取该参数。