【问题标题】:XPath/XML parsing to wrap groups of elementsXPath/XML 解析以包装元素组
【发布时间】:2012-10-19 11:18:12
【问题描述】:

这可能很简单,但我遗漏了一些东西......我有一个 XElement,我需要在其中找到特定元素的组并为该组插入一个新的父元素。

即,在下面的示例中,我需要创建一个新元素并将其作为 z 元素组的父元素添加到树中 -

<x>
    <z />
    <z />
    <z />
</x>

变成:

<x>
    <y>
        <z />
        <z />
        <z />
    </y>
</x>

Z元素之间不会有其他元素,但xml中可能有多个连续元素的实例。

如果可能的话,我宁愿避免使用 XSLT 来操作数据。

有什么建议吗?

【问题讨论】:

  • 1.你在 XPath 中是什么意思?您可以使用 XPath 来检查组,但您仍然需要 DOM/XSLT/other 来修改和生成输出文档。 2.“组”到底是什么意思(一个元素,更多元素,之间是否还有其他元素?)
  • 抱歉 - 我的问题有一半遗漏了。将编辑我的原始帖子

标签: xml xpath


【解决方案1】:

XPath 只能访问现有文档,不能创建新文档。

可用于创建新文档的技术包括 XSLT、XQuery、Linq 等。

在不知道为什么不想使用 XSLT 的情况下很难回答这个问题,对于我们中的许多人来说,这将是显而易见且最简单的方法。

【讨论】:

  • 只是个人喜好——我更喜欢使用 Linq 或 XQuery。鉴于我受限于 xsl 1.0,据我所见,它变得非常冗长
  • 好吧,当您复制大部分数据不变时,XSLT 解决方案通常比 XQuery 解决方案更简洁。然而,XSLT 2.0 解决方案的长度确实是 1.0 解决方案的一半。我很惊讶 Linq 可以在没有 XSLT 2.0 的平台上使用。
【解决方案2】:

你仍然需要使用一些东西(DOM/XSLT/etc)来修改文档或输出一个新的。

话虽如此,您可以通过定位组的第一个 &lt;z/&gt; 元素(从而遍历组)然后将其和组内的其他元素包装起来来解决问题。

  1. //z[not(preceding-sibling::z)] 将为您提供所有没有前置兄弟&lt;z/&gt;&lt;z/&gt; 元素,因此您在组中排在第一位(返回的元素数是组数)。

  2. 使用 DOM/other 将该元素包装在您的 &lt;y&gt; 元素中。

  3. 包装组中的其他元素。在第一个 &lt;z/&gt; 元素上,使用 following-sibling::z 获取组中的元素 2 到 N。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多