0

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

任何建议将不胜感激!

4

1 回答 1

0

您必须让 XPath 选择器知道您需要 HTML 元素。尽管 HTML 元素没有前缀,但它们确实有一个“默认命名空间”。

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

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

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

希望这可以帮助,

于 2013-11-04T23:18:35.360 回答