Tôi đang cố gắng sử dụng các Chức năng mở rộng của Microsoft XPath (chẳng hạn như ms: string-compare http://msdn.microsoft.com/en-us/library/ms256114.aspx) bên trong một đối tượng XPathExpression.Sử dụng các hàm ms: xpath bên trong XPathExpression
Những chức năng đang mở rộng bên trong thư viện MSXML, và nếu tôi sử dụng chúng trong một XslCompiledTransform (chỉ cần thêm "ms" không gian tên) họ làm việc như một nét duyên dáng:
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);
Sau đó, tôi đã cố gắng sử dụng chúng trong một 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);
Nhưng tôi nhận được ngoại lệ "XsltContext là cần thiết cho truy vấn này vì chức năng không xác định".
XsltContext là một XmlNamespaceManager cụ thể, nhưng tôi không biết liệu có thể khởi tạo nó mà không có XslCompiledTransform thực tế (nó trừu tượng) và sử dụng nó làm ngữ cảnh biểu thức của tôi không.
Có cách nào để thực hiện việc này (hoặc bất kỳ cách nào khác để sử dụng ms: các tiện ích bên trong XPathExpression) không?
Tôi đã chờ đợi một giải pháp sẽ có thể, nhưng sau khi một số tìm kiếm tôi tìm thấy một báo giá cho bạn. Vì đây không phải là của riêng tôi, tôi thêm nó làm chú thích [quote] Thật không may XPathNavigator không hỗ trợ các ms msc: extention , chúng chỉ có sẵn trong ngữ cảnh XSLT. Hãy xem tại http://www.tkachenko.com/blog/archives/000649.html cho mã mẫu mà bạn có thể sử dụng để móc các chức năng mở rộng đó vào XPathNavigator. Oleg Tkachenko [XML MVP, MCPD] [endquote] Vì vậy, không phải câu trả lời của riêng tôi, nhưng vẫn còn một cái gì đó bạn có thể sử dụng tôi nghĩ. –
cảm ơn rất nhiều ... Tôi đã hy vọng để có được một XsltContext instantiated bằng cách nào đó, nhưng có vẻ như cách duy nhất là để ghi đè lên nó và thực hiện tất cả các phương pháp trừu tượng :-( – Filini