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

时间:2011-02-08 23:09:32

标签: xpath parent-child ancestor

我无法以编程方式导航XML doc,我需要一个单行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>

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

其他一些注意事项:

  1. 解决方案必须是单行XPath查询,如果可能的话(由于下面给出的原因)。
  2. 它必须足够通用才能适用于任何Child元素(例如,它不能假设我总是在第一个,第二个或第三个孩子,例如)。
  3. 从上面的例子中,你可以看到我实际上并不需要实际的Root节点本身,只需要它的标签(即我不希望它下面的所有子节点)。但是,我确实需要实际的Child节点(以便获取Name和Age)。
  4. 注意:对于它的价值,我实际上无法以编程方式导航XML。我正在使用一个库(其代码我无法更改),其中我必须根据配置文件中的单行XPath查询来定义所有内容。它基本上会导航所有的Name元素,所以我的解决方案必须从那一点开始工作。

1 个答案:

答案 0 :(得分:1)

XPath是查询语言

除其他外,这意味着评估XPath表达式永远不会修改XML文档。

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

使用XSLT指定此类转换非常简单和自然。