我想在XPathExpression對象中使用Microsoft XPath擴展函數(例如ms:string-compare http://msdn.microsoft.com/en-us/library/ms256114.aspx)。在XPathExpression中使用ms:xpath函數
這些功能是MSXML庫中的擴展,如果我在XslCompiledTransform使用它們(只需添加「MS」命名空間),他們的工作就像一個魅力:
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);
然後我用他們的嘗試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);
但是我得到一個異常「XsltContext由於未知函數需要這個查詢」。
XsltContext是一個特定的XmlNamespaceManager,但我不知道是否有可能在沒有實際的XslCompiledTransform(它是抽象的)的情況下實例化它並將其用作我的表達式上下文。
有沒有辦法做到這一點(或任何其他方式來使用XPathExpression中的ms:擴展)?
我期待一個解決方案是可行的,但經過一段搜索我找到了你的報價。由於這不是我自己的,所以我將其添加爲註釋 [quote] 不幸的是,XPathNavigator不支持MIcrosoft ms:擴展 函數,它們僅在XSLT上下文中可用。 查看http://www.tkachenko.com/blog/archives/000649.html中的 示例代碼,您可以使用這些代碼將這些擴展功能掛接到 XPathNavigator。 Oleg Tkachenko [XML MVP,MCPD] [endquote] 所以,不是我自己的答案,但仍然可以使用我的想法。 – 2010-02-27 00:45:01
非常感謝...我希望以某種方式獲得XsltContext的實例化,但似乎唯一的方法是重寫它並實現所有抽象方法:-( – Filini 2010-03-05 18:19:41