2017-02-09 3 views
2

私はXMLにアクセスするのと同じテクニックを使っていくつかのJSONをXPathにしようとしています。以下は、同じXPathを適用した2つの等価構造です。XMLと同じではないJSONのxpath

let $json := xdmp:unquote('{ 
    "foo": { 
    "bar": { 
     "bas": "findme", 
     "boo": "324" 
    } 
    } 
}') 

let $xml := <xml> 
    <foo> 
    <bar> 
     <bas>findme</bas> 
     <boo>324</boo> 
    </bar> 
    </foo> 
</xml> 

return (
    $xml//node()[./text() = "findme"], 
    $json//node()[./text() = "findme"] 
) 

私は両方のために同じ結果を期待するが、私は以下のようになります。

XML結果

<bas>findme</bas>

JSON結果

{ "bas": "findme", "boo": "324" }

なぜ同じ結果が得られないのですか?

+0

XML構造とJSON構造は同じではありません。私はこのXMLが近いのかどうか疑問に思っています(明らかに同じXPathは機能しませんが): '。いずれにせよ、grtjnの答えはより役に立ちます。 –

+0

$ json // basは動作しますが$ json // @ basではないので、近いとは思わない – chriskelly

答えて

3

MarkLogicのテキストプロパティbasは名前付きテキストノードです。これはXML空間には存在しません。 //basのようなものが両方のために働くように設計されています。なぜならというテキストノードのツリー構造は、最も深いレベルで異なっている:

element bas { 
    text { "findme" } 
}, 
element boo { 
    text { "324" } 
} 

対:

object-node { 
    text bas { "findme" }, 
    text boo { "324" } 
} 

注:後者は、擬似コードです。 JSONコンストラクタの正しい使い方は、object-node { "bas": "findme", "boo": "324" }です。

fn:name()fn:local-name()はここでは機能しません)を使用して、後で何かに近づく方法があるかもしれません。次のように試してみてください:

let $json := xdmp:unquote('{ 
    "foo": { 
    "bar": { 
     "bas": "findme", 
     "boo": "324" 
    } 
    } 
}') 

let $xml := <xml> 
    <foo> 
    <bar> 
     <bas>findme</bas> 
     <boo>324</boo> 
    </bar> 
    </foo> 
</xml> 

let $xml-text := $xml//text()[. = "findme"] 
let $json-text := $json//text()[. = "findme"] 
for $t in ($xml-text, $json-text) 
return 
    if (name($t) eq "") then 
    $t/.. 
    else 
    object-node { name($t): $t } 

HTH!

関連する問題