XSLT Pass参数

时间:2012-11-11 02:41:39

标签: xml xslt parameters

我一直在寻找其他问题,但我看不出我做错了什么。 我想传递一个参数来仅选择某些结果,但我遇到了参数问题。

html(忽略IE部分)

<html>
<head>
<script>
function loadXMLDoc(dname)
{
if (window.XMLHttpRequest)
  {
  xhttp=new XMLHttpRequest();
  }
else
  {
  xhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xhttp.open("GET",dname,false);
xhttp.send("");
return xhttp.responseXML;
}

function displayResult()
{
xml=loadXMLDoc("f.xml");
xsl=loadXMLDoc("xsl.xsl");
// code for IE
if (window.ActiveXObject)
  {
  ex=xml.transformNode(xsl);
  document.getElementById("example").innerHTML=ex;
  }
// code for Mozilla, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
  {
  xsltProcessor=new XSLTProcessor();
  xsltProcessor.importStylesheet(xsl);

  xsltProcessor.setParameter(null, "testParam", "voo");
  // alert(xsltProcessor.getParameter(null,"voc"));

  document.getElementById("example").innerHTML = "";

  resultDocument = xsltProcessor.transformToFragment(xml,document);
  document.getElementById("example").appendChild(resultDocument);
  }


}

</script>
</head>
<body onload="displayResult()">
    <li><u><a onclick="displayResult();" style="cursor: pointer;">test1</a></u></li>
<div id="example" />
</body>
</html>

xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="vocaroos.xsl"?>
<test>
    <artist name="Bert">
        <voo>bert1</voo>
    </artist>
    <artist name="Pet">
        <voo>pet1</voo>
    </artist>
</test>

XSL

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="testParam"/>
<xsl:template match="/">
  <html>
  <body >
  <h2>Titleee</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Teeeeeest</th>
    </tr>
    <xsl:for-each select="test/artist">
    <tr>
      <td><xsl:value-of select="$testParam"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet> 

结果如下(左)

outcome

左边是这个,右边是我真正想要的。我当时正在等待

<xsl:value-of select="$testParam"/>

会和

一样
<xsl:value-of select="voo"/>     (right outcome)

因为我做setParameter(null,“testParam”,“voo”);在html中,但由于某种原因,xsl不使用“voo”作为select,而是写“voo”。

我一直在尝试不同的东西,但没有任何作用。哪里出错了?

2 个答案:

答案 0 :(得分:2)

参数的值是字符串“voo”,这就是应用于参数的xsl:value-of返回字符串“voo”的原因。没有理由期望XSLT处理器将“voo”视为要评估的XPath表达式。

如果参数的值是元素名称,并且您想要选择具有该名称的元素,则可以执行类似select =“* [name()= $ testParam]”的操作。如果它是一个更通用的XPath表达式,那么你将需要一个xx:evaluate()扩展名。

答案 1 :(得分:1)

XSLT不会在1.0或2.0中进行动态评估。某些扩展功能(例如saxon:evaluate)可以实现此功能,但它们的可用性取决于您使用的XSLT引擎。 XSLT 3.0建议在本地添加了xsl:evaluate,但是很少有XSLT引擎已经实现了3.0支持(saxon就是其中之一)。