我正在尝试对XSLT文档进行一些后处理,然后再进行XML转换。我认为最好的选择是将其作为XmlDocument加载,然后像我通常那样使用SelectNodes遍历要更新的节点,但我似乎无法找到我需要的节点。每个查询只返回0个节点。
我怀疑它与命名空间有关,但无法弄清楚如何。
示例XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" indent="yes"/>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<a href="/">
</body>
</html>
</xsl:template>
</xsl:stylesheet>
示例C#:
XmlDocument style = new XmlDocument();
style.Load("sample.xslt");
foreach (XmlNode anchor in style.SelectNodes("//a"))
...
但它永远不会找到<a>
标记 - 或者我尝试的任何其他标记。
我已尝试将代码更改为:
XmlDocument style = new XmlDocument();
style.Load("sample.xslt");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(style.NameTable);
nsmgr.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");
foreach (XmlNode anchor in style.SelectNodes("//a", nsmgr))
...
这实际上让我选择具有xsl:
前缀(例如.SelectNodes("/xsl:stylesheet")
)但没有内部HTML节点的节点。
任何建议都将不胜感激!
答案 0 :(得分:0)
你必须让XPAth选择器知道你想要HTML元素。虽然HTML元素没有前缀,但它们确实有一个“默认命名空间”。
在你的XPath中,你必须反映这一点。
将名为“http://www.w3.org/1999/xhtml”的前缀添加为“html”作为命名空间管理器的命名空间uri。
然后在XPath前面添加html:以查询有关html元素的信息。
希望这有帮助,