2010-10-20 4 views
5

मैं एक 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 

और यहाँ एक्सएमएल की शुरुआत मैं पैरामीटर में प्राप्त करते हैं:

यहाँ शीर्ष लेख और xslt में कॉल है

<?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 का उपयोग करना होगा। एक स्पष्टीकरण और एक अनुशंसित समाधान के लिए मेरा जवाब देखें। –

उत्तर

1

node-set() केवल परिणाम दस्तावेज़ टुकड़े (आरडीएफ) पर काम करता है, लेकिन आप इसे एक स्ट्रिंग देते हैं, जो कुछ पूरी तरह से अलग है (भले ही स्ट्रिंग सामग्री एक्सएमएल की तरह दिखती हो)।

आपको क्या करना चाहिए एक्सएमएल में स्ट्रिंग को पार्स करना है। आप use an extension script for that कर सकते हैं। निम्नलिखित मेरे लिए काम किया (कमांड लाइन पर msxsl.exe के साथ परीक्षण किया गया), लेकिन यदि आप जेस्क्रिप्ट का उपयोग नहीं करना चाहते हैं तो आप ऐसा करने के लिए सी # या किसी अन्य समर्थित भाषा का उपयोग कर सकते हैं।

<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

मैं इसका उपयोग नहीं कर सकता क्योंकि मैं क्लासिक एएसपी में हूं: मैंने .NET का उपयोग करके कुछ परीक्षण किया है (जो मेरी पहली पोस्ट पर मेरे .net स्टैक ट्रेस को समझाता है), लेकिन अंतिम परिणाम क्लासिक एएसपी में होना चाहिए। –

+0

@ पॉल: मुझे लगता है कि आपको यह कहने से पहले इसे आजमाएं "मैं इसका उपयोग नहीं कर सकता"। – Tomalak

+0

क्षमा करें आप सही हैं। मैंने आपकी विधि को एक पल करने की कोशिश की है, लेकिन मैं केवल एक एक्सएमएल रखने के लिए एक समापन के लिए चुनौती देता हूं। यह मेरी समस्याओं का समाधान करता है। वैसे भी आपकी मदद के लिए बहुत बहुत धन्यवाद! सीधे पथ के लिए –

2

मामले में पैरामीटर आप गुजर रहे हैं पहले से ही एक सच्चे nodeset (XPath नाविक या .NET या MSXML के लिए IXMLDOMNodeList में XPathNodeIterator), आप की जरूरत नहीं है और ms:node-set() विस्तार समारोह का उपयोग नहीं करना चाहिए। बस ms:nodeset() पर कॉल को हटा दें।

यदि यह एक स्ट्रिंग है जो एक्सएमएल का प्रतिनिधित्व करता है - तो यह नहीं होना चाहिए! इस स्ट्रिंग को एक नोडसेट के लिए स्वीकार्य पैरामीटर प्रकारों में से एक पर पार्स करें और फिर केवल सही नोड-सेट का उपयोग करके परिवर्तन को आवेदक करें।

+0

+1। एक्सएसएलटी में तारों को पार्स करने से बेहतर विकल्प। – Tomalak

0

रूप Dimitre कहा कि तुम एमएस का उपयोग कर सकते हैं: नोड सेट लेकिन आप नोड()

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

<xsl:value-of select="ms:node-set($yourVariable)/theOtherElement"/> 
संबंधित मुद्दे