使用浏览器转换XML时,是否可以通过URL将参数传递给XSLT?

使用浏览器转换XML时,是否可以通过URL将参数传递给XSLT?

Is it possible to pass a parameter to XSLT through a URL when using a browser to transform XML?

使用浏览器转换XML(Google Chrome或IE7)时,是否可以通过URL将参数传递给XSLT样式表?

例:

data.xml

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
<root>
    <document type="resume">
        John Doe</author>
    </document>
    <document type="novella">
        Jane Doe</author>
    </document>
</root>

sample.xsl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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" />
    <xsl:template match="/">
    <xsl:param name="doctype" />
    <html>
        <head>
            List of <xsl:value-of select="$doctype" />
        </head>
        <body>
            <xsl:for-each select="//document[@type = $doctype]">
                <p>
<xsl:value-of select="author" />
</p>
            </xsl:for-each>
        </body>
    </html>
</<xsl:stylesheet>

不幸的是,不能-您不能仅将参数传递给XSLT客户端。
Web浏览器从XML获取处理指令;并直接使用XSLT对其进行转换。

可以通过查询字符串URL传递值,然后使用JavaScript动态读取它们。但是,这些将无法在XSLT(XPath表达式)中使用-因为浏览器已经转换了XML / XSLT。它们只能在呈现的HTML输出中使用。


只需将参数作为属性添加到XML源文件中,并将其用作样式表的外观即可。

1
xmlDoc.documentElement.setAttribute("myparam",getParameter("myparam"))

JavaScript函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Get querystring request paramter in javascript
function getParameter (parameterName ) {

   var queryString = window.top.location.search.substring(1);

   // Add"=" to the parameter name (i.e. parameterName=value)
   var parameterName = parameterName +"=";
   if ( queryString.length > 0 ) {
      // Find the beginning of the string
      begin = queryString.indexOf ( parameterName );
      // If the parameter name is not found, skip it, otherwise return the value
      if ( begin != -1 ) {
         // Add the length (integer) to the beginning
         begin += parameterName.length;
         // Multiple parameters are separated by the"&" sign
         end = queryString.indexOf ("&" , begin );
      if ( end == -1 ) {
         end = queryString.length
      }
      // Return the string
      return unescape ( queryString.substring ( begin, end ) );
   }
   // Return"null" if no parameter has been found
   return"null";
   }
}


即使转换是在客户端,您也可以生成XSLT服务器端。

这使您可以使用动态脚本来处理参数。

例如,您可以指定:

1
<?xml-stylesheet type="text/xsl"href="/myscript.cfm/sample.xsl?paramter=something" ?>

然后,在myscript.cfm中,您将输出XSL文件,但使用动态脚本来处理查询字符串参数(这将根据您使用的脚本语言而有所不同)。


推荐阅读