使用C#和XmlDocument遍历XSL DOM

时间:2013-11-04 23:04:22

标签: c# xml xslt

我正在尝试对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节点的节点。

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

你必须让XPAth选择器知道你想要HTML元素。虽然HTML元素没有前缀,但它们确实有一个“默认命名空间”。

在你的XPath中,你必须反映这一点。

将名为“http://www.w3.org/1999/xhtml”的前缀添加为“html”作为命名空间管理器的命名空间uri。

然后在XPath前面添加html:以查询有关html元素的信息。

希望这有帮助,