在 XPathExpression 中使用 ms: xpath 函数
我正在尝试使用 Microsoft XPath 扩展函数(例如 ms:string-compare http ://msdn.microsoft.com/en-us/library/ms256114.aspx)位于 XPathExpression 对象内。
这些函数是 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: 扩展)?
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)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这些 ms 前缀的函数不包含在 .net 框架 dom 类中。您需要创建自定义函数来完成同样的事情。
您可以使用下面的示例代码;
或者
你将需要这些课程;
These ms prefixed functions are not included in .net framework dom classes. you need to create your custom functions to do same thing.
you may use sample code below;
or
you will need these classes;
您可以使用已编译的 XPath,或者使用 Linqtoxml 和 XElement 动态使用:
我的比较函数:
You can use the compiled XPath, or dynamic with Linqtoxml and XElement:
My compare function: