用其祖先节点/标签包装 XML 元素

Posted

技术标签:

【中文标题】用其祖先节点/标签包装 XML 元素【英文标题】:Wrapping an XML element with its ancestor nodes/tags 【发布时间】:2011-02-08 23:09:32 【问题描述】:

我无法以编程方式浏览 XML 文档,出于我在最后描述的原因,我需要一个单行 XPath 解决方案。

我正在使用类似于下面的 XML 模式。 (这是我必须按原样使用的东西。)

<Root>
  <!-- Child 1 -->
  <Child>
      <Name>Joe</Name>
      <Age>12</Age>
  </Child>
  <!-- Child 2 -->
  <Child>
      <Name>Mike</Name>
      <Age>25</Age>
  </Child>
   <!-- Child 3 --> 
  <Child>
      <Name>Jane</Name>
      <Age>20</Age>
  </Child>
</Root>

假设我已经在“Joe”节点(即 Child 1 中的 Name 元素),我需要定义一个 XPath 查询来“包装”该节点,如下所示:

<Root>
  <!-- Child 1 -->
  <Child>
      <Name>Joe</Name>
      <Age>12</Age>
  </Child>
</Root>

我尝试了各种祖先、字符串连接、连接等组合,但似乎找不到正确“包装”元素的解决方案。 (例如,我使用祖先的方式是返回 all 子节点,这不是我需要的。)

其他一些注意事项:

    如果可能的话,解决方案必须是单行 XPath 查询(原因如下)。 它必须足够通用以适用于任何 Child 元素(例如,它不能假设我总是在第一个或第二个或第三个孩子)。 从上面的示例中,您可以看到我实际上并不需要实际的根节点本身,只需要它的标签(即我不希望它下面的所有子节点)。但是,我确实需要实际的子节点(以便获得名称和年龄)。

注意:对于它的价值,我实际上不能以编程方式导航 XML。我正在使用一个库(我无法更改其代码),在该库中,我必须根据配置文件中的单行 XPath 查询来定义所有内容。它基本上会浏览所有的 Name 元素,所以我的解决方案必须从那时开始工作。

【问题讨论】:

正如 xpath 的 wiki 标签所述(也取自规范):XPath 的主要目的是处理 XML 文档的某些部分 它没有'不序列化新文档,与 XQuery 和 XSLT 相反。 好问题,+1。请参阅我的回答,了解为什么不能单独使用 XPath 完成此操作。 谢谢,亚历杭德罗。您的回答和 Dimitre 帮助我意识到我们需要一种不同的方法来解决这个问题。 【参考方案1】:

XPath 是一种查询语言

这意味着 XPath 表达式的计算永远不会修改 XML 文档。

所以,答案是 XPath 无法修改 XML 文档或创建新文档。

使用 XSLT 指定此类转换非常容易和自然。

【讨论】:

谢谢,迪米特。我发现在这种情况下我们不能使用 XPath 解决方案。 我应该说“在这种情况下不能使用 XPath only 解决方案。”再次感谢。

以上是关于用其祖先节点/标签包装 XML 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何找到具有某个标签的后代叶节点的最低祖先?

[ jquery 文档处理 wrapInner(htm|element|fnl) ] 此方法用于把所有匹配的元素的子元素(包括文本节点)使用指定的 HTML 元素来包裹

获取没有特定祖先 xml xpath 的节点

如何使用jQuery找到标签为<tbody>的第一个祖先节点?

jQuery之防止冒泡事件,冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件。

XML中的结构数组没有包装节点?