Home. 
.

transparent

transparent

transparent

Altova Mailing List Archives


Passing an XPathNavigator to a custum function.

From: KevinBurton@-----------.---------.---
To: NULL
Date: 8/1/2008 2:31:00 PM

I have the following C# code that illustrates the problem I am having:

        static void TestCount(int id, IEnumerable<string> messages, 
IEnumerable<string> skus)
        {
            XslCompiledTransform xsltProc = new XslCompiledTransform();
            XsltSettings xsltSettings = new XsltSettings(false, true);
            xsltProc.Load(@"..\..\TestStyleSheet.xsl", xsltSettings, null);

            XmlDocument messageDoc = MakeMessageDoc(messages);
            XmlDocument skuDoc = MakeSkuDoc(skus);

            XsltArgumentList args = new XsltArgumentList();
            args.AddParam("DocumentTransactionId", string.Empty, id);
            args.AddParam("IdenticalList", string.Empty, skuDoc);
            args.AddParam("MessageTestList", string.Empty, messageDoc);
            args.AddParam("CatalogConnectionString", string.Empty, "test 
connection");

            
xsltProc.Transform(XmlReader.Create(File.OpenRead(@"..\..\XmlSent.xml")), 
args, Console.Out);
            Console.WriteLine();
            Console.WriteLine("Number of item elements: {0}.",
skuDoc.SelectNodes("/root/list/sku").Count);
            Console.WriteLine();
            Console.WriteLine();
        }

        static XmlDocument MakeSkuDoc(IEnumerable<string> items)
        {
            XmlDocument paramDoc = new XmlDocument();
            using (XmlWriter writer =
paramDoc.CreateNavigator().AppendChild())
            {
                writer.WriteStartElement("root");
                writer.WriteStartElement("list");
                foreach (string item in items)
                {
                    writer.WriteElementString("sku", item);
                }
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
            return paramDoc;
        }
        static XmlDocument MakeMessageDoc(IEnumerable<string> items)
        {
            XmlDocument messageDoc = new XmlDocument();
            using (XmlWriter writer =
messageDoc.CreateNavigator().AppendChild())
            {
                writer.WriteStartElement("root");
                writer.WriteStartElement("list");
                foreach (string item in items)
                {
                    writer.WriteElementString("item", item);
                }
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
            return messageDoc;
        }

        static void Main(string[] args)
        {
            TestCount(10, new string[] { "1", "2", "3", "4", "5" }, new 
string[] { "21200-140319", "11442-114976", "19930" });
            TestCount(30, new string[] { "1" }, new string[] { 
"21200-140319", "11442-114976", "19930" });
            TestCount(40, new string[] { }, new string[] { });
        }


And the stylesheet:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:bsi="http://BuySeasons/SqlXslFunctions">
	<msxsl:script language="C#" implements-prefix="bsi">
		public bool MerchandisedProduct(string connectionString, XPathNavigator nav)
		{
		return false;
		}
	</msxsl:script>
	<xsl:param name="MessageTestList"/>
	<xsl:param name="DocumentTransactionId"/>
	<xsl:param name="IdenticalList"/>
	<xsl:param name="CatalogConnectionString"/>
	<xsl:template match="/">
		<HTML>
			<BODY>
				<h3>
					We cannot recognize your child SKU Document Transaction Id - 
<xsl:value-of select="$DocumentTransactionId"/>
				</h3>
				<br/>
				<br/>
				<h4>
					Identical Errors - <xsl:value-of 
select="count(/AmazonEnvelope/Message[(MessageID = 
$MessageTestList/root/list/item) and (Relationship/Relation/SKU = 
$IdenticalList/root/list/sku)])"/>
					Unmerchandised Errors - <xsl:value-of 
select="count(/AmazonEnvelope/Message[(MessageID = 
$MessageTestList/root/list/item) and 
not(bsi:MerchandisedProduct($CatalogConnectionString,Relationship/Relation/SKU))])"/>
				</h4>
			</BODY>
		</HTML>
	</xsl:template>

</xsl:stylesheet>

and the first few lines of the XML that I am using:


<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
  <Header>
    <DocumentVersion>1.01</DocumentVersion>
    <MerchantIdentifier>M_BUYCOSTUME_330363</MerchantIdentifier>
  </Header>
  <MessageType>Relationship</MessageType>
  <PurgeAndReplace>false</PurgeAndReplace>
  <Message>
    <MessageID>1</MessageID>
    <OperationType>Update</OperationType>
    <Relationship>
      <ParentSKU>10041-109342</ParentSKU>
      <Relation>
        <SKU>21200-140319</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>18636-133654</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>19316-134062</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>31053-144544</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>31991-146377</SKU>
        <Type>Accessory</Type>
      </Relation>
    </Relationship>
  </Message>
  <Message>
    <MessageID>2</MessageID>
    <OperationType>Update</OperationType>
    <Relationship>
      <ParentSKU>10052-112512</ParentSKU>
      <Relation>
        <SKU>11442-114976</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>12297-113846</SKU>
        <Type>Accessory</Type>
      </Relation>
    </Relationship>
  </Message>
  <Message>
    <MessageID>3</MessageID>
    <OperationType>Update</OperationType>
    <Relationship>
      <ParentSKU>10074-112504</ParentSKU>
      <Relation>
        <SKU>19930</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>19899</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>17392-125713</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>31052-144543</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>33572</SKU>
        <Type>Accessory</Type>
      </Relation>
    </Relationship>
  </Message>
  <Message>
    <MessageID>4</MessageID>
    <OperationType>Update</OperationType>
    <Relationship>
      <ParentSKU>10087</ParentSKU>
      <Relation>
        <SKU>21267-140386</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>20347-138059</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>11555</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>10330-111730</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>31061</SKU>
        <Type>Accessory</Type>
      </Relation>
    </Relationship>
  </Message>
  <Message>
    <MessageID>5</MessageID>
    <OperationType>Update</OperationType>
    <Relationship>
      <ParentSKU>10090</ParentSKU>
      <Relation>
        <SKU>1787-102265</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>31300-145019</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>31301-145020</SKU>
        <Type>Accessory</Type>
      </Relation>
    </Relationship>
  </Message>
  <Message>
    <MessageID>6</MessageID>
    <OperationType>Update</OperationType>
    <Relationship>
      <ParentSKU>10102</ParentSKU>
      <Relation>
        <SKU>27405-143173</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>1424-102268</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>1787-102265</SKU>
        <Type>Accessory</Type>
      </Relation>
    </Relationship>
  </Message>
  <Message>
    <MessageID>7</MessageID>
    <OperationType>Update</OperationType>
    <Relationship>
      <ParentSKU>10114-112615</ParentSKU>
      <Relation>
        <SKU>21515</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>21683</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>19230-133916</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>11575-114873</SKU>
        <Type>Accessory</Type>
      </Relation>
      <Relation>
        <SKU>6190</SKU>
        <Type>Accessory</Type>
      </Relation>
    </Relationship>
  </Message>
</AmazonEnvelope>

Running the code gives me an XslException:

System.Xml.Xsl.XslTransformException: Cannot convert a node-set which 
contains z
ero nodes or more than one node to a single node.
   at System.Xml.Xsl.Runtime.XsltConvert.ToNode(IList`1 listItems)
   at <xsl:template match="/">(XmlQueryRuntime 
{urn:schemas-microsoft-com:xslt-d
ebug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current)
   at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
   at Execute(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
   at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, 
XmlResolver da
taSources, XsltArgumentList argumentList, XmlSequenceWriter results)
   at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, 
XmlResolver da
taSources, XsltArgumentList argumentList, XmlWriter writer, Boolean 
closeWriter)

   at System.Xml.Xsl.XmlILCommand.Execute(XmlReader contextDocument, 
XmlResolver
 dataSources, XsltArgumentList argumentList, TextWriter results)
   at System.Xml.Xsl.XslCompiledTransform.Transform(XmlReader input, 
XsltArgumen
tList arguments, TextWriter results)
   at TestSyleSheet.Program.TestCount(Int32 id, IEnumerable`1 messages, 
IEnumera
ble`1 skus) in 
C:\Projects\BuySeasonsIT\Source\Brain\Trunk\BuyseasonsServices\Te
stSyleSheet\Program.cs:line 29
   at TestSyleSheet.Program.Main(String[] args) in 
C:\Projects\BuySeasonsIT\Sour
ce\Brain\Trunk\BuyseasonsServices\TestSyleSheet\Program.cs:line 76

I was wondering if this is a limitation of Xslt or if there was a work around?

Thank you.

Kevin





transparent
Print
Mail
Digg
delicious
Disclaimer
.

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.

.
.

transparent

transparent