Próbuję użyć funkcji rozszerzenia Microsoft XPath (takich jak ms: string-compare http://msdn.microsoft.com/en-us/library/ms256114.aspx) wewnątrz obiektu XPathExpression.Używanie funkcji ms: xpath wewnątrz XPathExpression
Te funkcje są rozszerzeniami wewnątrz biblioteki MSXML, i jeśli mogę użyć ich w XslCompiledTransform (po prostu dodanie nazw „MS”) działają jak urok:
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);
Potem spróbował wykorzystać je w sposób 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);
Ale otrzymuję wyjątek „XsltContext jest potrzebna dla tego zapytania z powodu nieznanej funkcji”.
XsltContext to specyficzny obiekt XmlNamespaceManager, ale nie wiem, czy można go utworzyć bez rzeczywistej XslCompiledTransform (to streszczenie) i użyć go jako kontekstu wyrażeń.
Czy jest jakiś sposób to zrobić (lub jakikolwiek inny sposób użycia ms: rozszerzenia wewnątrz XPathExpression)?
Spodziewałem rozwiązanie byłoby możliwe, ale po jakimś przeszukanie znalazłem dla ciebie wycenę. Ponieważ nie jest to moje własne, dodam je jako komentarz [quote] Niestety XPathNavigator nie obsługuje funkcji MIcrosoft ms: extention , są one dostępne tylko w kontekście XSLT. Spójrz na http://www.tkachenko.com/blog/archives/000649.html dla przykładowego kodu , za pomocą którego możesz podłączyć te funkcje rozszerzeń do XPathNavigator . Oleg Tkachenko [XML MVP, MCPD] [endquote] Więc, nie moja własna odpowiedź, ale nadal coś, co można użyć myślę. –
dziękuję bardzo ... Miałem nadzieję, że jakoś powstanie instancja XsltContext, ale wydaje się, że jedynym sposobem jest obejście i wdrożenie wszystkich abstrakcyjnych metod :-( – Filini