xquery / xslt用于根据特定值选择值

时间:2017-10-23 23:42:40

标签: xslt xquery

我因为以下请求而被困在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里面但是甚至那只给了我第一个地址

请让我知道其他任何选项。感谢

2 个答案:

答案 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 ()