Subject: RE: [xsl] Retrieve External String XML Data as Object|
Date: Wed, 21 Sep 2005 11:28:59 +0200
John, did you ever come up with a solution for this? I have a similar challenge. In the stylesheet, I can get access to a string that's supposed to be a node-set. When I try to convert the string into a node-set, I'm getting what I think is a flat text-node and I don't know how to fix it. In the stylesheet, there's a node by the name of "RecipInstituteNum" which contains the following: <NewDataSet> <InstituteData> <InstitutionID>ID</InstitutionID> <Institute>INSTITUTE</Institute> <Institut_Standard_Name>SOMESTANDARDNAME</Institut_Standard_Name> <Institution_Location>SOMELOCATION</Institution_Location> <Country_Code>COMECOUNTRY</Country_Code> </InstituteData> </NewDataSet> ...but as far as I can make out, the stylesheet sees "RecipInstituteNum" as a text node so that when I try something like: <xsl:value-of select="./RecipInstituteNum/NewDataSet/InstituteData/InstituteID"/> ...I get nothing. As a work around, I've tried using msxsl:node-set but am getting a "Cannot convert the operand to 'Result tree fragment'" error and am having a hard time deciphering Michael's wisdom, so I decided to use msxsl scripting like below, hoping that the XmlDocument returned would be intelligible to the stylesheet: <msxsl:script language="VB" implements-prefix="user"> <![CDATA[ Public Shared Function TransformToNodeset(ByVal arg As String) As XmlDocument Dim reader As XmlTextReader = New XmlTextReader(arg, XmlNodeType.Document, Nothing) Dim doc As New System.Xml.XmlDocument doc.Load(reader) Return doc End Function ]]> </msxsl:script> Now, when I try to access RecipInstituteNum like in the following: <xsl:value-of select="user:TransformToNodeset(./RecipInstituteNum)"/> ... I get (what I think is) a flat text node: IDINSTITUTESOMESTANDARDNAMESOMELOCATIONSOMECOUNTRY Any advice? Thanks! Tony -----Original Message----- To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: RE: [xsl] Retrieve External String XML Data as Object You write a URIResolver (under Java JAXP) or XmlResolver (under .NET) that intercepts the URI and returns an object that the XSLT processor can handle, for example (under JAXP) a StreamSource wrapping a StringReader that holds the lexical XML. Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: John [mailto:john-xsl-list@xxxxxxxx] > Sent: 27 June 2005 21:09 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Retrieve External String XML Data as Object > > I have a data source that is only available through APIs, not through > URLs or files. I can represent this external data as XML, > but how can I > make this data available to my XSL? The document() function seems to > require the first parameter be an URL, and the node-set > extensions don't > seem to handle strings (at least not the Microsoft node-set > extensions). > > Where custom:GetData() basically returns some XML: > > return( "<root><node>some text</node></root>" ); > > I have tried: > > <xsl:variable name="extdata" select="msxsl:node-set( > custom:GetData())" /> > <xsl:value-of select="$extdata/root/node/text()" /> > > which gives 'cannot convert the operand to result tree fragment'. > > I have also tried: > > <xsl:variable name="extdata" select="document( custom:GetData())" /> > <xsl:value-of select="$extdata/root/node/text()" /> > > Which gives no output. Do I have to make the data URL-accessible, or > how can I get this XML into my XSLT as an object instead of a string? > Should I convert the string to some other type of object before > returning it to the XSL? Of course I would prefer to avoid > extensions > if possible. Hopefully there is something like document() > that works on > strings instead of URLs? This email message is intended only for the use of the named recipient. Information contained in this email message and its attachments may be privileged, confidential and protected from disclosure. If you are not the intended recipient, please do not read, copy, use or disclose this communication to others. Also please notify the sender by replying to this message and then delete it from your system.