2017-04-13 180 views
0

由于这个问题的范围之外的原因,我需要能够处理同一结构但属于不同名称空间的多个xml文档(don'请问)。XPath - 使用local-name()时根据兄弟节点的值选择一个节点

要做到这一点,我变得非常习惯使用像我的许多价值选择以下的XPath:

//*[local-name()='apple']/*[local-name()='flavor']/text()" 

我缺少谓语的理解阻止我基于选择节点的值兄弟节点的值。考虑下面的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<fruit> 
    <apple> 
     <kind>Red Delicious</kind> 
     <flavor>starchy</flavor> 
    </apple> 
    <apple> 
     <kind>Granny Smith</kind> 
     <flavor>tart</flavor> 
    </apple> 
    <apple> 
     <kind>Pink Lady</kind> 
     <flavor>sweet</flavor> 
    </apple> 
</fruit> 

比方说,我想写一个xpath,将选择一个格兰尼史密斯苹果的味道。虽然我通常会做这样的事情:

//apple[kind/text()='Granny Smith']/flavor/text() 

我无法弄清楚如何合并利用当地名的概念()是不可知的命名空间,同时还选择基于兄弟姐妹的值的节点。

简而言之,无论输入fruit xml文档属于哪个命名空间,返回“tart”所需的xpath是什么?

+0

我并不完全确定自己明白,但//*[contains(.,'tart')]是我认为你正在寻找的东西。更具体地说,虽然:// apple [contains(@flavor,'tart')]会返回有问题的苹果,假设有其他的水果也可能具有标记名味儿。 –

+0

我想要这个xpath的等价物,这个名称空间是无知的,并且可以用于任何水果xml,而不管它属于哪个名称空间(只要结构在上面):// apple [kind/text()='Granny Smith']]/flavor/text()让我们假设我们不知道什么味道是为了参数 – Russ

+0

我想我现在明白了。我可以告诉你,如果它有帮助,我将如何在Java中实现它:“// * [local-name()='type']/* [local-name()='property'] /../ name )= '输出'] /文本()”。替换( “类型”, “苹果属性 ” “类型的输出 ” “味道”)“)替换(”。“)替换(”; (air-code,未经测试) –

回答

0

我需要能够处理相同 结构的多个XML文档,但属于不同的命名空间(不要问)

我来处理,这是先转换数据首选方式使用单个名称空间,然后进行适当的转换。这样做(a)使真正的转换更加简单,(b)将所有名称空间转换逻辑放在一个位置,并且(c)使命名空间转换逻辑可重用 - 您可以使用相同的转换,而不管数据如何随后使用。

相关问题