Using ms: xpath functions inside XPathExpression
Posted
by
Filini
on Stack Overflow
See other posts from Stack Overflow
or by Filini
Published on 2010-02-23T17:58:11Z
Indexed on
2010/12/24
23:54 UTC
Read the original article
Hit count: 228
xpath
|extension-methods
I am trying to use Microsoft XPath Extension Functions (such as ms:string-compare http://msdn.microsoft.com/en-us/library/ms256114.aspx) inside an XPathExpression object.
These functions are extensions inside the MSXML library, and if I use them in an XslCompiledTransform (simply adding the "ms" namespace) they work like a charm:
var xsl =
@"
<?xml version=""1.0"" encoding=""UTF-8""?>
<xsl:stylesheet version=""2.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:ms=""urn:schemas-microsoft-com:xslt"">
<xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes""/>
<xsl:template match=""/Data"">
<xsl:element name=""Result"">
<xsl:value-of select=""ms:string-compare(@timeout1, @timeout2)""/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>";
var xslDocument = new XmlDocument();
xslDocument.LoadXml(xsl);
var transform = new XslCompiledTransform();
transform.Load(xslDocument);
Then I tried using them in an XPathExpression:
XPathNavigator nav = document.DocumentElement.CreateNavigator();
XPathExpression expr = nav.Compile("ms:string-compare(/Data/@timeout1, /Data/@timeout2)");
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace("ms", "urn:schemas-microsoft-com:xslt");
expr.SetContext(manager);
nav.Evaluate(expr);
But I get an exception "XsltContext is needed for this query because of an unknown function".
XsltContext is a specific XmlNamespaceManager, but I don't know if it's possible to instantiate it without an actual XslCompiledTransform (it's abstract) and use it as my expression context.
Is there any way to do this (or any other way to use ms: extensions inside an XPathExpression)?
© Stack Overflow or respective owner