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

问题描述 投票:0回答:2

为了在元素名称的动态出现中循环并提取相应的值而苦苦挣扎的位。我正在尝试直接使用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)
xml xpath xpath-1.0
2个回答
1
投票

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

/myXMLNode/temperatureInCelsius/Date

或可能

/myXMLNode/temperatureInCelsius/Date/text()

直接选择文本节点。

不要用诸如|之类的分隔符将那些结果连接起来,而不是在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'

0
投票

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

因此,如果您不希望像concat(date[1],'|',date[2])这样的固定连接,并且可以轻松地依靠XML序列化/解析配置(主要是关于缩进和仅保留空白文本节点),则可以使用此XPath表达式:

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

结果:

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

here中测试

© www.soinside.com 2019 - 2024. All rights reserved.