【发布时间】:2020-05-28 01:06:01
【问题描述】:
我正在尝试将具有命名空间声明的节点转换为使用前缀。我的第一个尝试是只使用 xslt 来转换 xml,但我开始考虑使用 XmlDocument 类并使用 SelectNodes() 方法来实现它。我看到的问题是,当我尝试选择具有命名空间的节点时,它会选择该节点及其子节点。我认为这是因为它正在选择包含子节点的节点。
<foo xmlns="some url">
<child>child</child>
</foo>
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xmlstring);
var query = xdoc.SelectNodes("//*[namespace-uri()='some url']");
查询变量将返回<foo> 和<child> 节点,所以当我遍历节点并将其更改为使用前缀时,我得到以下结果。
<prefix:foo>
<prefix:child></prefix:child>
</prefix:foo>
在这种情况下,有没有办法只返回 <foo> 节点?是否也使用 xslt 对其进行转换更好?
我不认为在使用 XDocument 和 XElement 时可以更改名称空间或前缀,所以这就是我使用 XmlDocument 的原因。
更新
想要的结果 id 将是仅在声明所在节点上的前缀。这是有效的 xml 正确还是前缀需要在子节点上才有效?
<prefix:foo>
<child>child</child>
</prefix:foo>
【问题讨论】:
-
这似乎是 XSLT 的一项任务,因为使用 DOM 或 LINQ to XML 您必须将任何元素更改为新前缀,这与使用 XSLT 所做的几乎相同,但使用XSLT 你可以写一个通用模板
match="*"然后使用<xsl:element name="prefix:{local-name()}" namespace="{namespace-uri()}">来构造需要的结果。 -
是的,xslt 的问题是我有同样的问题。我不想更改所有节点以添加前缀,只是那些具有命名空间声明的节点。
<xsl:template match="//*[namespace-uri()='url'"> -
你能告诉我们你想要的结果吗?
-
没有任何命名空间声明不清楚你想要实现什么?您是否希望结果中的
child元素不在命名空间中?还是保留他们在输入文档中的命名空间? -
我在 xml 的根节点中添加了一个命名空间 ..
xmlns:prefix="some url"然后我想通过并重命名在节点<foo xmlns="some url">...</foo>上声明了命名空间的所有节点并将其更改为<prefix:foo>...</prefix:foo>但在这种情况下只有 foo 元素,而不是子元素。更有意义?