2011-02-08 93 views
1

我已经看过以前在stackoverflow和XPath参考和教程中回答的问题,但我没有看到任何与我的场景完全匹配的东西。如果已经提出了这个问题,或者我忽略了一个微不足道的答案,可以提前道歉。 (另外,为了使其更容易理解,我简化了一些情况,主要的一点是我无法以编程方式浏览XML文档,并且出于我在最后描述的原因需要单行XPath解决方案。)用它的祖先节点/标签包装一个XML元素

我正在使用一个如下所示的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> 

假设我已经在“乔”节点,我需要定义一个XPath查询,将(即内儿童1 Name要素) “包装”该节点如下:

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

我已经试过祖先的各种组合,串加入,CONCAT等,但似乎无法说,“包装”的元素正确地找到解决方案。 (我使用的祖先的方式是返回所有子节点,例如,这不是我所需要的。)

其他注意事项:(1)解决方案必须是单行XPath查询,if这是可能的(由于下面给出的原因)。 (2)它必须足够通用,可以用于任何子元素(例如,它不能假定我总是处于第一或第二或第三个孩子)。 (3)从上面的例子中,你可以看到我实际上并不需要实际的Root节点,只是它的标签(即我不希望所有的Child节点在它下面)。但是,我确实需要实际的子节点(以便获得名称和年龄)。

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

在此先感谢。

+0

由于声明`xpath`的wiki标签(也取自规范):* XPath的主要目的是解决XML文档的部分问题* **它不会序列化新文档**,相反XQuery和XSLT。 – 2011-02-08 23:20:51

+0

好问题,+1。请参阅我的答案,了解为什么无法单独使用XPath来完成此操作。 – 2011-02-08 23:52:14

回答

1

XPath是查询语言

这意味着对XPath表达式的评估决不会修改XML文档。

所以,答案是:修改XML文档或创建一个新的文件不能使用的XPath来完成。

这样的转换非常容易和自然地用XSLT指定。

相关问题