[OSB] Finding the XPath with the node name

ノード名からノードの完全Pathを知るにはどうしたらよいだろう…という問いに対して、簡単なXQueryを使えば、所望のノードまでのPathを取得できます。

declare namespace orcl = "http://www.oracle.com/weblogic_soa_and_more";
declare function orcl:findXpath($path as element()*)
as xs:string 
{ if(local-name($path/..)='') 
then local-name($path) 
else concat(orcl:findXpath($path/..),'/',local-name($path)) }; 
declare function orcl:PathFinder($inputRecord as element(), $path as element()) 
as element(*) 
{ for $index in $inputRecord//*[local-name()=$path/text()] 
return orcl:findXpath($index) } 
}; 
declare variable $inputRecord as element() external; 
declare variable $path as element() external; 
orcl:PathFinder($inputRecord, $path)

このXQueryでは、ノードが
        <myNode>nodeName</myNode>
で、メッセージが
        <node1><node2><nodeName>test</nodeName></node2></node1>
の場合、
        node1/node2/nodeName
が得られます。

このXQueryが特に役立つのは、Oracle Service Busの検証アクションを利用するときです。OSBの検証アクションは、エラーがある場合には完全Pathで返さず、ノード名のみ返すからです。

次のOSBのプロジェクトでは、検証アクションの結果を再フォーマットするためにこのXQueryを利用しています。


以下のような不正なXMLを受信した場合、

<myElem xmlns="http://blogs.oracle.com/weblogic_soa_and_more">
      <mySubElem>
      </mySubElem>
</myElem>


先ほどのXQueryを利用することで、OSBから以下のようなValidationエラーを取得することができます。

<MessageIsNotValid>

<ErrorDetail  nbr="1">

<dataElementhPath>Body/myElem/mySubElem</dataElementhPath>

<message>

Expected element 'Subelem1@http://blogs.oracle.com/weblogic_soa_and_more' before the end of the content in element mySubElem@http://blogs.oracle.com/weblogic_soa_and_more

</message>

</ErrorDetail>

</MessageIsNotValid>

OSBのサンプルプロジェクトはこちら。 sbconfig_xpath.jar

原文はこちら。
http://blogs.oracle.com/weblogic_soa_and_more/2011/01/xpathofanode.html

0 件のコメント:

コメントを投稿