Estoy tratando de usar las funciones de extensión XPath de Microsoft (como ms: string-compare http://msdn.microsoft.com/en-us/library/ms256114.aspx) dentro de un objeto XPathExpression.Uso de las funciones ms: xpath dentro de XPathExpression
Estas funciones son extensiones dentro de la biblioteca MSXML, y si las uso en un XslCompiledTransform (simplemente añadiendo el espacio de nombres "MS") que trabajan como un encanto:
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);
Entonces les intentado utilizar en una 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);
Pero consigo una excepción "XsltContext se necesita para esta consulta debido a una función desconocida".
XsltContext es un XmlNamespaceManager específico, pero no sé si es posible crear una instancia sin un XslCompiledTransform real (es abstracto) y usarlo como mi contexto de expresión.
¿Hay alguna manera de hacer esto (o de alguna otra forma de usar ms: extensiones dentro de XPathExpression)?
que estaba esperando una solución que sería posible, pero después de algún buscando encontré un presupuesto para ti. Como esto no es mío, lo agrego como comentario [quote] Desafortunadamente XPathNavigator no es compatible con MIcrosoft ms: funciones de extensión , solo están disponibles en contexto XSLT. Eche un vistazo a http://www.tkachenko.com/blog/archives/000649.html para obtener un código de ejemplo que puede usar para enganchar esas funciones de extensión en XPathNavigator. Oleg Tkachenko [XML MVP, MCPD] [endquote] Así que, no es mi propia respuesta, pero todavía hay algo que podría usar, creo. –
muchas gracias ... Esperaba obtener un XsltContext instanciado de alguna manera, pero parece que la única manera es anularlo e implementar todos los métodos abstractos :-( – Filini