用它的祖先节点/标签包装一个XML元素
我已经看过以前在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元素,所以我的解决方案必须从这一点开始。
在此先感谢。
XPath是查询语言。
这意味着对XPath表达式的评估决不会修改XML文档。
所以,答案是:修改XML文档或创建一个新的文件不能使用只的XPath来完成。
这样的转换非常容易和自然地用XSLT指定。
由于声明`xpath`的wiki标签(也取自规范):* XPath的主要目的是解决XML文档的部分问题* **它不会序列化新文档**,相反XQuery和XSLT。 – 2011-02-08 23:20:51
好问题,+1。请参阅我的答案,了解为什么无法单独使用XPath来完成此操作。 – 2011-02-08 23:52:14