我在xslt样式表上工作,我应该接收两个额外的XML作为参数。当我使用node-set()方法(来自namespace ms,microsoft)时出现错误。 XML的内容是正确的。参数使用经典ASP发送。
这是xslt中的标题和调用:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
...
<xsl:param name="xmlPlanning"></xsl:param>
<xsl:variable name="myXml" select="ms:node-set($xmlPlanning)"></xsl:variable>
<xsl:value-of select="ms:node-set($xmlPlanning)/*"/>
这是错误的堆栈跟踪:
[XsltException: Impossible de convertir l'opérande en 'fragment de l'arborescence résultat'.]
System.Xml.Xsl.XsltOld.XsltFunctionImpl.ToNavigator(Object argument) +380943
System.Xml.Xsl.XsltOld.FuncNodeSet.Invoke(XsltContext xsltContext, Object[] args, XPathNavigator docContext) +33
MS.Internal.Xml.XPath.FunctionQuery.Evaluate(XPathNodeIterator nodeIterator) +292
[XPathException: Échec de la fonction 'ms:node-set()'.]
MS.Internal.Xml.XPath.FunctionQuery.Evaluate(XPathNodeIterator nodeIterator) +347
System.Xml.Xsl.XsltOld.Processor.RunQuery(ActionFrame context, Int32 key) +24
System.Xml.Xsl.XsltOld.VariableAction.Execute(Processor processor, ActionFrame frame) +200
System.Xml.Xsl.XsltOld.ActionFrame.Execute(Processor processor) +20
System.Xml.Xsl.XsltOld.Processor.Execute() +82
System.Xml.Xsl.XsltOld.Processor.Execute(TextWriter writer) +96
System.Xml.Xsl.XslTransform.Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver) +68
System.Xml.Xsl.XslTransform.Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver) +43
System.Web.UI.WebControls.Xml.Render(HtmlTextWriter output) +132
这是我在参数中收到的xml的开头:
<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfGenerationPlanningDesign xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://webservices.secureholiday.net/">
<GenerationPlanningDesign>
可能是我的问题?
答案 0 :(得分:2)
如果您传递的参数已经是真正的节点集(.NET中的XPath导航器或XPathNodeIterator或MSXML的IXMLDOMNodeList),您不需要也不能使用{ {1}}扩展功能。只需移除对ms:node-set()
的调用。
如果它是一个表示XML的字符串 - 那么它不应该!将此字符串解析为节点集的允许参数类型之一,然后仅使用true节点集调用转换。
答案 1 :(得分:1)
node-set()
仅对结果文档片段(RDF)进行操作,但是您给它一个字符串,这是完全不同的(即使字符串内容看起来像XML)。
您必须做的是将字符串解析为XML。你可以use an extension script for that。以下内容适用于我(在命令行上使用msxsl.exe进行测试),但如果您不想使用JScript,则可以使用C#或任何其他受支持的语言执行相同的操作。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:script="urn:my-scripts"
exclude-result-prefixes="ms script"
>
<ms:script language="JScript" implements-prefix="script">
<![CDATA[
function stringToXml(str) {
var xml = new ActiveXObject("MSXML2.DOMDocument.4.0");
xml.async = false;
xml.loadXML(str);
return xml;
}
]]>
</ms:script>
<xsl:param name="xmlPlanning"></xsl:param>
<xsl:variable name="myXml" select="script:stringToXml(string($xmlPlanning))" />
<xsl:template match="/">
<xsl:value-of select="$myXml/*" /><!-- whatever -->
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
正如Dimitre所说,您可以使用 ms:node-set ,但必须使用 node()
<xsl:variable name="yourVariable">
<xsl:copy-of select="/foo/bar/something/node()"/>
</xsl:variable>
<xsl:value-of select="ms:node-set($yourVariable)/theOtherElement"/>