2017-10-23 24 views
-2

以下の要求のためにxqueryにスタックされています。私は型の値に基づいてアドレスを選択したい。タイプがある場合 、すなわち「StreetAddressは」その後、freeFormat「マグワイア」特定の値に基づいて値を選択するためのxquery/xslt

<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"場合は、しかし、この1つは私の最初のアドレスのみを提供します

I forループを使用しようとしましたが、その中にケースがある場合でも使用しましたが、最初のアドレスがちょうど私に与えられました。

私に他のオプションを教えてください。 <type>で値を使用して値Maguireをフェッチしてくれてありがとう

答えて

0

XPathは、あなたが値を取得する際に、あなたの入力XML内の異なる要素に関連しnamespaceの世話をする必要が

<xsl:value-of select="associatedAddress/address[type='StreetAddress']/freeFormat" /> 

です。ネームスペースがXSLで正しく処理されない場合、値は抽出されません。

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() 
関連する問題