|
|
|
date: Fri, 1 Aug 2008 14:31:01 -0700,
group: microsoft.public.xsl
back
Passing an XPathNavigator to a custum function.
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
date: Fri, 1 Aug 2008 14:31:01 -0700
author: Kevin Burton
|
|