【问题标题】:Traversing an XSL DOM using C# and XmlDocument使用 C# 和 XmlDocument 遍历 XSL DOM
【发布时间】:2013-11-04 23:04:22
【问题描述】:

我正在尝试在 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"))
  ...

但它永远找不到 &lt;a&gt; 标记 - 或我尝试的任何其他标记。

我已尝试将代码更改为:

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 节点。

任何建议将不胜感激!

【问题讨论】:

    标签: c# xml xslt


    【解决方案1】:

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

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

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

    然后在你的 XPath 前面加上 html: 用于查询 html 元素。

    希望这会有所帮助,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 2014-04-25
      相关资源
      最近更新 更多