我因为以下请求而被困在xquery上。我想根据类型值选择地址。 即如果类型是" StreetAddress"然后选择freeFormat" Maguire"
<associatedAddress>
<address xmlns="http://services.oracle.com/v1.0/Common">
<type xmlns="http://services.oracle.com/v1.0/Common">StreetAddress</type>
<freeFormat xmlns="http://services.oracle.com/v1.0/Common">Maguire</freeFormat>
</address>
<address>
<type xmlns="http://services.oracle.com/v1.0/Common">CityAddress</type>
<freeFormat xmlns="http://services.oracle.com/v1.0/Common">SanFransisco</freeFormat>
</address>
</associatedAddress>
我试过几种方式:
如果associatedAddress/address/type="StreetAddress"
然后..,但这个只给我第一个地址
我也尝试使用for循环然后使用if case里面但是甚至那只给了我第一个地址
请让我知道其他任何选项。感谢
答案 0 :(得分:0)
使用Maguire
中的值获取值<type>
的XPath是
<xsl:value-of select="associatedAddress/address[type='StreetAddress']/freeFormat" />
在获取值时,您需要处理与输入XML中的不同元素关联的namespace
。如果在XSL中未正确处理命名空间,则不会提取该值。
答案 1 :(得分:0)
因为您在输入xml时要求xQuery,所以:
declare namespace common="http://services.oracle.com/v1.0/Common";
for $n in associatedAddress//common:type[. = "StreetAddress"]
return
$n/../common:freeFormat
产生所需的结果
<freeFormat xmlns="http://services.oracle.com/v1.0/Common">Maguire</freeFormat>
诀窍在于,在您的输入中,xml associatedAddress与其他元素不在同一名称空间中,因此您需要调整查询以将其考虑在内。
你提到了if子句,但是不清楚你的问题所需的输出是什么。您可以使用以下作为模板来修改结果。
declare namespace common="http://services.oracle.com/v1.0/Common";
for $n in associatedAddress//common:type
return
switch($n)
case "StreetAddress" return $n/../common:freeFormat
case "CityAddress" return "something else"
default
return ()