对于我第一次发现Nokogiri和XML解析,我需要提取一个web服务提供的Code项列表(及其子项)。文档看起来像这样:
<message:Structure xmlns:common="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/common" xmlns:structure="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/structure" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:message="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message" xsi:schemaLocation="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message SDMXMessage.xsd">
<message:Header>
<message:ID>70c32d97-bbd5-44c7-8bff-50a63abe07eb</message:ID>
<message:Test>false</message:Test>
<message:Prepared>2021-08-26T11:37:37</message:Prepared>
<message:Sender id="CH1">
<message:Name>CH1</message:Name>
</message:Sender>
</message:Header>
<message:CodeLists>
<structure:CodeList id="CL_LEISTUNGSART" version="1.0" agencyID="CH1" isFinal="true">
<structure:Name xml:lang="de">Leistungsart</structure:Name>
<structure:Name xml:lang="fr">Type prestation</structure:Name>
<structure:Name xml:lang="it">Tipo di prestazione</structure:Name>
<structure:Code value="01">
</structure:Code>
<structure:Code value="02">
<structure:Description xml:lang="de">Reguläre Unterstützung mit Zielvereinbarung</structure:Description>
<structure:Description xml:lang="fr">Aide financière régulière avec contrat d'insertion</structure:Description>
<structure:Description xml:lang="it">Assistenza regolare con contratto d’inserimento</structure:Description>
<structure:Annotations>
</structure:Annotations>
</structure:Code>
<structure:Code value="03">
</structure:Code>
<structure:Code value="04">
</structure:Code>
<structure:Code value="05">
</structure:Code>
<structure:Code value="10">
</structure:Code>
<structure:Code value="21">
</structure:Code>
<structure:Code value="22">
</structure:Code>
<structure:Code value="23">
</structure:Code>
<structure:Code value="25">
</structure:Code>
<structure:Code value="26">
</structure:Code>
<structure:Code value="32">
</structure:Code>
<structure:Code value="33">
</structure:Code>
<structure:Code value="34">
</structure:Code>
<structure:Code value="35">
</structure:Code>
<structure:Code value="36">
</structure:Code>
<structure:Code value="37">
</structure:Code>
<structure:Code value="40">
</structure:Code>
<structure:Code value="50">
</structure:Code>
<structure:Annotations>
</structure:Annotations>
</structure:CodeList>
<structure:CodeList id="CL_LEISTUNGSART" version="2.0" agencyID="CH1">
</structure:CodeList>
</message:CodeLists>
</message:Structure>
请求是:从version为最大值且isFinal为true的结构中选择一个CodeList,然后读取Code元素(及其子元素)。
我可以从结构名称空间中选择CodeList元素:
document.css("structure|CodeList")
但是当我试图评估属性版本时,我迷路了和isFinal.
非常感谢您的帮助!
由于你将在下面看到的原因,这并不是一个真正的答案,但是对于一个评论来说它太长了,可能在某种程度上有所帮助。
就纯xpath表达式而言,要获取(例如)structure:CodeList
节点的structure:Name
子节点的法语翻译(它满足您的两个要求),下面的表达式
//structure:CodeList[@version=max(//*[@isFinal="true"]/number(@version))]/structure:Name[@xml:lang="fr"]/text()
将输出
Type prestation
和其他语言类似,例如structure:Description
。由于xml使用名称空间,因此对于nokogiri,必须使用
doc.xpath('//structure:CodeList[@version=max(//*[@isFinal="true"]/number(@version))]/structure:Name[@xml:lang="fr"]/text()',
'structure' => "http://www.SDMX.org/resources/SDMXML/schemas/v2_0/structure")
问题是在表达式中使用了max()
函数。我现在不能自己测试,但是max()
是xpath 2.0函数,我的理解是只支持xpath 1.0。
为什么可能要解决对以后xpath版本的支持问题,请看这里。