我有这样的回应:
<s:Envelope xmlns:s="http://.....">
<s:Body>
<GetHistoricalMeterReadingsByEanResponse xmlns="....">
<GetHistoricalMeterReadingsByEanResult xmlns:a="....." xmlns:i="http://....">
<Header xmlns=".....">
<HasException>false</HasException>
<Message/>
</Header>
<a:HistoricalReadingSet>
<a:HistoricalMeterReadingSet>
<a:EanId>111425200000005564</a:EanId>
<a:HistoricalReadings>
<a:HistoricalMeterReading>
<a:ClientReadingDate i:nil="true"/>
<a:EanId>111425200000005564</a:EanId>
<a:EdsnMeterId>3523525</a:EdsnMeterId>
<a:EnergyProductType>ELK</a:EnergyProductType>
<a:MeterReadingId>1842643</a:MeterReadingId>
<a:Mutation>
<a:Consumer i:nil="true"/>
<a:DossierId i:nil="true"/>
<a:Initiator i:nil="true"/>
<a:MarketEvent>Historical</a:MarketEvent>
<a:MarketEventDate>2015-01-28T00:00:00</a:MarketEventDate>
</a:Mutation>
<a:NrOfRegisters>2</a:NrOfRegisters>
<a:ProcessId i:nil="true"/>
<a:ReadingSource>Customer_TMR</a:ReadingSource>
<a:RegisterReadings>
<a:RegisterReading>
<a:MeasureUnit>KWH</a:MeasureUnit>
<a:MeteringDirection>LVR</a:MeteringDirection>
<a:NrOfDigits>6</a:NrOfDigits>
<a:TariffType>L</a:TariffType>
<a:Value>1345</a:Value>
</a:RegisterReading>
<a:RegisterReading>
<a:MeasureUnit>KWH</a:MeasureUnit>
<a:MeteringDirection>LVR</a:MeteringDirection>
<a:NrOfDigits>6</a:NrOfDigits>
<a:TariffType>N</a:TariffType>
<a:Value>2345</a:Value>
</a:RegisterReading>
</a:RegisterReadings>
<a:Status>Accepted</a:Status>
<a:BudgetCanStartSettlement>false</a:BudgetCanStartSettlement>
<a:CanStartDispute>false</a:CanStartDispute>
<a:OtherSupplierCanStartSettlement>false</a:OtherSupplierCanStartSettlement>
</a:HistoricalMeterReading>
<a:HistoricalMeterReading>
<a:ClientReadingDate i:nil="true"/>
<a:EanId>111425200000005564</a:EanId>
<a:EdsnMeterId>3523525</a:EdsnMeterId>
<a:EnergyProductType>ELK</a:EnergyProductType>
<a:MeterReadingId>1842645</a:MeterReadingId>
<a:Mutation>
<a:Consumer>8714252018141</a:Consumer>
<a:DossierId>23074990</a:DossierId>
<a:Initiator>1114252018146</a:Initiator>
<a:MarketEvent>Periodic</a:MarketEvent>
<a:MarketEventDate>2015-09-14T00:00:00</a:MarketEventDate>
</a:Mutation>
<a:NrOfRegisters>2</a:NrOfRegisters>
<a:ProcessId i:nil="true"/>
<a:ReadingSource>Customer_EDSN</a:ReadingSource>
<a:RegisterReadings>
<a:RegisterReading>
<a:MeasureUnit>KWH</a:MeasureUnit>
<a:MeteringDirection>LVR</a:MeteringDirection>
<a:NrOfDigits>6</a:NrOfDigits>
<a:TariffType>L</a:TariffType>
<a:Value>3000</a:Value>
</a:RegisterReading>
<a:RegisterReading>
<a:MeasureUnit>KWH</a:MeasureUnit>
<a:MeteringDirection>LVR</a:MeteringDirection>
<a:NrOfDigits>6</a:NrOfDigits>
<a:TariffType>N</a:TariffType>
<a:Value>4000</a:Value>
</a:RegisterReading>
</a:RegisterReadings>
<a:Status>Accepted</a:Status>
<a:BudgetCanStartSettlement>false</a:BudgetCanStartSettlement>
<a:CanStartDispute>true</a:CanStartDispute>
<a:OtherSupplierCanStartSettlement>true</a:OtherSupplierCanStartSettlement>
</a:HistoricalMeterReading>
</a:HistoricalReadings>
</a:HistoricalMeterReadingSet>
</a:HistoricalReadingSet>
</GetHistoricalMeterReadingsByEanResult>
</GetHistoricalMeterReadingsByEanResponse>
问题是:我在oreder中使用此响应来查找具有3value field = true的项目。我需要这样的项目用于下一个请求方法。
我试过像这样的smth,但它不起作用:
<a:HistoricalReadingSet//a:HistoricalMeterReadingSet//a:HistoricalReadings//a:HistoricalMeterReading a="http://....">
{
for $x in //a:HistoricalReadingSet//a:HistoricalMeterReadingSet//a:HistoricalReadings//a:HistoricalMeterReading
where $x/a:HistoricalReadingSet//a:HistoricalMeterReadingSet//a:HistoricalReadings//a:HistoricalMeterReading//a:CanStartDispute/text() = 'true'
return $x
}
</a:HistoricalReadingSet//a:HistoricalMeterReadingSet//a:HistoricalReadings//a:HistoricalMeterReading>
有什么问题?你会怎么做?
答案 0 :(得分:1)
在Xml中,数字不允许作为标记名称的第一个字符,除了你的xml没有很好地形成,因为某些标记没有正确关闭。首先尝试更正你的xml。
<a:SetOfItems>
<a:Item>
<a:Id>1</a:Id>
<a:firstValue>12121212</a:firstValue>
<a:secondValue>sdfhjfsdf</a:secondValue>
<a:thirdValue>false</a:thirdValue>
</a:Item>
<a:Item>
<a:Id>2</a:Id>
<a:firstValue>12121212</a:firstValue>
<a:secondValue>sdfhjfsdf</a:secondValue>
<a:thirdValue>true</a:thirdValue>
</a:Item>
</a:SetOfItems>
然后,要将您的XQuery添加为属性转移,仅选择<a:Item>
元素,其中<a:thirdValue>
具有文本值true
,您可以使用以下表达式:
<a:SetOfItems xmlns:a="blabla">
{
for $x in //*:Item
where $x/*:thirdValue/text() = 'true'
return $x
}
</a:SetOfItems>
请注意使用*
通配符来引用任何名称空间。
将此XQuery应用于您的XML,您将获得:
<a:SetOfItems xmlns:a="blabla">
<a:Item>
<a:Id>2</a:Id>
<a:firstValue>12121212</a:firstValue>
<a:secondValue>sdfhjfsdf</a:secondValue>
<a:thirdValue>true</a:thirdValue>
</a:Item>
</a:SetOfItems>
基于问题更新的编辑
我认为您的XQuery中存在各种错误,后续XQuery适用于您的xml:
<a:HistoricalReadingSet xmlns:a="http://a">
{
for $x in //*:HistoricalReadingSet/*:HistoricalMeterReadingSet
where $x/*:HistoricalReadings/*:HistoricalMeterReading/*:CanStartDispute/text() = 'true'
return $x
}
</a:HistoricalReadingSet>
它产生以下结果:
<a:HistoricalReadingSet xmlns:a="http://a">
<a:HistoricalMeterReadingSet xmlns:a="http://a" xmlns:i="http://i" xmlns="http://b" xmlns:s="http://soap">
<a:EanId>111425200000005564</a:EanId>
<a:HistoricalReadings>
<a:HistoricalMeterReading>
<a:ClientReadingDate i:nil="true"/>
<a:EanId>111425200000005564</a:EanId>
<a:EdsnMeterId>3523525</a:EdsnMeterId>
<a:EnergyProductType>ELK</a:EnergyProductType>
<a:MeterReadingId>1842643</a:MeterReadingId>
<a:Mutation>
<a:Consumer i:nil="true"/>
<a:DossierId i:nil="true"/>
<a:Initiator i:nil="true"/>
<a:MarketEvent>Historical</a:MarketEvent>
<a:MarketEventDate>2015-01-28T00:00:00</a:MarketEventDate>
</a:Mutation>
<a:NrOfRegisters>2</a:NrOfRegisters>
<a:ProcessId i:nil="true"/>
<a:ReadingSource>Customer_TMR</a:ReadingSource>
<a:RegisterReadings>
<a:RegisterReading>
<a:MeasureUnit>KWH</a:MeasureUnit>
<a:MeteringDirection>LVR</a:MeteringDirection>
<a:NrOfDigits>6</a:NrOfDigits>
<a:TariffType>L</a:TariffType>
<a:Value>1345</a:Value>
</a:RegisterReading>
<a:RegisterReading>
<a:MeasureUnit>KWH</a:MeasureUnit>
<a:MeteringDirection>LVR</a:MeteringDirection>
<a:NrOfDigits>6</a:NrOfDigits>
<a:TariffType>N</a:TariffType>
<a:Value>2345</a:Value>
</a:RegisterReading>
</a:RegisterReadings>
<a:Status>Accepted</a:Status>
<a:BudgetCanStartSettlement>false</a:BudgetCanStartSettlement>
<a:CanStartDispute>false</a:CanStartDispute>
<a:OtherSupplierCanStartSettlement>false</a:OtherSupplierCanStartSettlement>
</a:HistoricalMeterReading>
<a:HistoricalMeterReading>
<a:ClientReadingDate i:nil="true"/>
<a:EanId>111425200000005564</a:EanId>
<a:EdsnMeterId>3523525</a:EdsnMeterId>
<a:EnergyProductType>ELK</a:EnergyProductType>
<a:MeterReadingId>1842645</a:MeterReadingId>
<a:Mutation>
<a:Consumer>8714252018141</a:Consumer>
<a:DossierId>23074990</a:DossierId>
<a:Initiator>1114252018146</a:Initiator>
<a:MarketEvent>Periodic</a:MarketEvent>
<a:MarketEventDate>2015-09-14T00:00:00</a:MarketEventDate>
</a:Mutation>
<a:NrOfRegisters>2</a:NrOfRegisters>
<a:ProcessId i:nil="true"/>
<a:ReadingSource>Customer_EDSN</a:ReadingSource>
<a:RegisterReadings>
<a:RegisterReading>
<a:MeasureUnit>KWH</a:MeasureUnit>
<a:MeteringDirection>LVR</a:MeteringDirection>
<a:NrOfDigits>6</a:NrOfDigits>
<a:TariffType>L</a:TariffType>
<a:Value>3000</a:Value>
</a:RegisterReading>
<a:RegisterReading>
<a:MeasureUnit>KWH</a:MeasureUnit>
<a:MeteringDirection>LVR</a:MeteringDirection>
<a:NrOfDigits>6</a:NrOfDigits>
<a:TariffType>N</a:TariffType>
<a:Value>4000</a:Value>
</a:RegisterReading>
</a:RegisterReadings>
<a:Status>Accepted</a:Status>
<a:BudgetCanStartSettlement>false</a:BudgetCanStartSettlement>
<a:CanStartDispute>true</a:CanStartDispute>
<a:OtherSupplierCanStartSettlement>true</a:OtherSupplierCanStartSettlement>
</a:HistoricalMeterReading>
</a:HistoricalReadings>
</a:HistoricalMeterReadingSet>
</a:HistoricalReadingSet>
基于评论的编辑
如果您只想取<MeterReadingId>
sibling为真的<CanStartDispute>
值,您只需使用跟随XPath而不是XQuery:
//*:HistoricalReadingSet/*:HistoricalMeterReadingSet/*:HistoricalReadings/*:HistoricalMeterReading/*:MeterReadingId[../*:CanStartDispute/text() = 'true']
希望它有所帮助,