1

我无法以编程方式浏览 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>

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

其他一些考虑:

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

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

4

1 回答 1

1

XPath 是一种查询语言

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

因此,答案是:使用XPath无法修改 XML 文档或创建新文档。

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

于 2011-02-08T23:50:46.383 回答