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 件のコメント:
コメントを投稿