XPath - 使用local-name()时根据兄弟节点的值选择一个节点

时间:2017-04-13 17:39:52

标签: xpath xml-namespaces predicate

由于超出此问题范围的原因,我需要能够处理多个具有相同结构但属于不同命名空间的xml文档(不要问)。

为了实现这一点,我已经习惯于在我的许多价值选择中使用如下所示的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来选择Granny Smith苹果的味道。虽然我通常会这样做:

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

我无法弄清楚如何将仍然使用local-name()的概念合并为名称空间无关,同时仍然根据兄弟的值选择一个节点。

简而言之,返回&#34; tart&#34;所需的xpath是什么?无论输入水果xml文档属于哪个命名空间?

1 个答案:

答案 0 :(得分:0)

  

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

我首选的方法是首先将数据转换为使用单个命名空间,然后进行适当的转换。这样做(a)使实际转换更加简单,(b)将所有命名空间转换逻辑放在一个地方,(c)使命名空间转换逻辑可重用 - 无论数据如何随后都可以使用相同的转换使用。