2010-10-20 69 views
5

我在xslt樣式表上工作,我應該接收兩個額外的XML作爲參數。當我使用node-set()方法(從命名空間ms,microsoft)時出現錯誤。 XML的內容是正確的。參數以傳統的ASP發送。XSLT:無法將操作數轉換爲「結果樹片段」

這裏的頭和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

問得好,+1。請參閱我的回答以獲得解釋和推薦的解決方案。 – 2010-10-20 13:00:58

回答

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> 
+0

我不能使用這個,因爲我在經典的Asp:我已經使用.NET做了一些測試(在第一篇文章中解釋我的.net堆棧跟蹤),但最終的結果必須在經典的asp。 – 2010-10-20 10:07:31

+0

@保羅:我認爲你應該在你說「我不能用這個」之前試用它。 – Tomalak 2010-10-20 10:50:19

+0

對不起,您是對的。我已經嘗試了一下你的方法,但我最終選擇一個串聯以便只有一個XML。這解決了我的問題。無論如何,非常感謝您的幫助! – 2010-10-20 13:43:24

2

如果你正在傳遞的參數已經是一個真正的節點集(在.NET或爲的IXMLDOMNodeList MSXML的XPath Navigator或創建XPathNodeIterator),你並不需要,不得使用ms:node-set()擴展功能。只需撥打電話ms:nodeset()即可。

萬一它是一個表示XML的字符串 - 它不應該!將此字符串解析爲某個節點集的某個允許的參數類型,然後才使用真正的節點集來調用轉換。

+0

+1爲直接路徑。比在XSLT本身中解析字符串更好的選擇。 – Tomalak 2010-10-20 13:28:33

0

正如Dimitre說,你可以使用MS:節點集,但你必須使用節點()

<xsl:variable name="yourVariable"> 
     <xsl:copy-of select="/foo/bar/something/node()"/>   
</xsl:variable> 

<xsl:value-of select="ms:node-set($yourVariable)/theOtherElement"/>