xPath Expression v1.0 [迭代器,如果有的话]

xPath Expression v1.0 [iterator if any]

比特努力循环遍历元素名称的动态出现并提取相应的值。 我正在尝试直接 xPath 表达式。

我的 xml 看起来像:

<myXMLNode>
    <sunnyDay>YES</sunnyDay>
    <snowing>NO</snowing>   
    <temperatureInCelsius>
        <Date>2013-06-01</Date>
        <Date>2013-06-30</Date>
        <Date>2013-07-01</Date>
    </temperatureInCelsius>
</myXMLNode>

我想提取所有可用的 Date 元素值,这些元素值用竖线分隔,并且不断变化(目前我上面的示例中有 3 个日期) 示例输出:2013-06-01|2013-06-30|2013-07-01

我在下面试过但没有成功:

1. concat(//myXMLNode/temperatureInCelsius/Date[1], "_" ,//myXMLNode/temperatureInCelsius/Date[2], "_" ,//myXMLNode/temperatureInCelsius/Date[3])

2. //myXMLNode/temperatureInCelsius/Date[position()>0 or position()<=count(myXMLNode/temperatureInCelsius/Date)

3. //myXMLNode/temperatureInCelsius/Date[position()>0 and position()<=count(myXMLNode/temperatureInCelsius/Date)

检索所有相关字符串的正确 XPath 表达式是

/myXMLNode/temperatureInCelsius/Date

或者可能

/myXMLNode/temperatureInCelsius/Date/text()

直接select个文本节点。

| 等分隔符连接这些结果不应在 XPath 中完成,而应在您使用的宿主语言或环境中完成。例如,这在 Python:

中很容易做到
>>> from lxml import etree
>>> document_string = """<myXMLNode>
...     <sunnyDay>YES</sunnyDay>
...     <snowing>NO</snowing>
...     <temperatureInCelsius>
...         <Date>2013-06-01</Date>
...         <Date>2013-06-30</Date>
...         <Date>2013-07-01</Date>
...     </temperatureInCelsius>
... </myXMLNode>"""
>>> root = etree.fromstring(document_string)
>>> dates = root.xpath("/myXMLNode/temperatureInCelsius/Date/text()")
>>> dates
['2013-06-01', '2013-06-30', '2013-07-01']
>>> "|".join(dates)
'2013-06-01|2013-06-30|2013-07-01'

在 XPath 1.0 中没有序列或节点集字符串值操作(即来自 XPath 2.0+ 的 string-join())。

因此,如果您不想要像 concat(date[1],'|',date[2]) 这样的固定连接并且您愿意依赖 XML serialization/parsing 配置(主要是关于缩进和仅保留空白文本节点)您可以使用此 XPath 表达式:

translate(normalize-space(/myXMLNode/temperatureInCelsius),' ','|')

结果:

2013-06-01|2013-06-30|2013-07-01

here

中测试