2017-09-14 11 views
1

入力ファイル:XQueryを使用してXMLファイル内のすべての要素と属性の出現をカウントするにはどうすればよいですか?

<?xml version="1.0" encoding="UTF-8"?> 
    <books> 
     <book id="6636551"> 
      <master_information> 
       <book_xref> 
        <xref type="Fiction" type_id="1">72771KAM3</xref> 
        <xref type="Non_Fiction" type_id="2">US72771KAM36</xref> 
       </book_xref> 
      </master_information> 
      <book_details> 
       <price>24.95</price> 
       <publish_date>2000-10-01</publish_date> 
       <description>An in-depth look at creating applications with XML.</description> 
      </book_details> 
     </book> 
     <book id="119818569"> 
      <master_information> 
       <book_xref> 
        <xref type="Fiction" type_id="1">070185UL5</xref> 
        <xref type="Non_Fiction" type_id="2">US070185UL50</xref> 
       </book_xref> 
      </master_information> 
      <book_details> 
       <price>19.25</price> 
       <publish_date>2002-11-01</publish_date> 
       <description>A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</description> 
      </book_details> 
     </book> 
     <book id="119818568"> 
      <master_information> 
       <book_xref> 
        <xref type="Fiction" type_id="1">070185UK7</xref> 
        <xref type="Non_Fiction" type_id="2">US070185UK77</xref> 
       </book_xref> 
      </master_information> 
      <book_details> 
       <price>5.95</price> 
       <publish_date>2004-05-01</publish_date> 
       <description>After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</description> 
      </book_details> 
     </book> 
     <book id="119818567"> 
      <master_information> 
       <book_xref> 
        <xref type="Fiction" type_id="1">070185UJ0</xref> 
        <xref type="Non_Fiction" type_id="2">US070185UJ05</xref> 
       </book_xref> 
      </master_information> 
      <book_details> 
       <price>4.95</price> 
       <publish_date>2000-09-02</publish_date> 
       <description>When Carla meets Paul at an ornithology conference, tempers fly as feathers get ruffled.</description> 
      </book_details> 
     </book> 
    </books> 

私は、ヘッダーと、単純なカウント機能を作ることができた(FYI - 私は、XQueryに新たなんだ)

let $x := string-join(('xref', count(//book//xref)), '&#58;') 
return $x 

予想通り、私は、ヘッダーとカウントを取得

xref:8 

すべての要素と属性に対して機能するように拡張しようとしましたが、機能しません。明らかに間違っているヘッダーのために$ xを入れます。私が使用できる要素/ attrの名前を取得する関数があります。私は1つを見つけることができませんでした。

for $x in //book 
let $c := string-join(($x, count($x)), '&#58;') 
return $x 

私は、プレフィックスヘッダはコロンとその要素/ attrのカウントが続き、その後、「要素/ ATTRの名前」になりたいです。私は間違って何をしていますか?私は本当にあなたの応答に感謝します。

P.S.この種のものはXSLTでやる方が簡単だと思う人もいるかもしれませんが、できる限りXqueryを使ってすべてのデータクエリを実行したいと思います。私はXQueryがXSLTよりも理解しやすいことがわかりました。なぜなら、私はすでに使い慣れているSQLのようなSQL構造だからです。

答えて

2

が@wstからの溶液の変種だ、XQueryの3.0の機能を利用するようになって

"{}b:2" 
"{c.com}c:1" 
"{}a:1" 
+0

let $ doc行がextを検索します。私のシステムの異常なファイルですか?私はファイルのパスに入れようとしましたが、うまくいきませんでした。私は一般的にXMLファイルをBaseX GUIにロードしてからXQueryを実行します。あなたのコードにXMLファイルをロードするためには何が必要ですか?ありがとう! – Fenil

+1

通常の方法でdoc()関数を使用します。 –

4

これはXQueryでも簡単に実行できます。戦略は要素名の別個の値を最初に取得してから、その数を問い合わせることです。そのトリッキーな部分は、名前空間を維持しながらそれをやっています。次に、要素QName値をクラーク表記文字列に作成し、次に別の値を取得してから、XPathを使用してクエリを実行する前にQNameを再構築する例を示します。

let $doc := (: some document :) 
let $names := distinct-values($doc//*/concat('{' , namespace-uri-from-QName(node-name(.)), '}', local-name(.))) 
for $n in $names 
let $ns := substring-after(substring-before($n, '}'), '{') 
let $local-name := substring-after($n, '}') 
let $qname := QName($ns, $local-name) 
return concat($n, ':', count($doc//*[node-name(.) = $qname])) 

このクエリは、簡単に複数の文書や要素を報告するように修正が、ちょうど要素の数が増加することに注意して、それがクエリを実行するのにかかる時間は、意志することができます。

declare function local:clarkName($name as xs:QName) { 
    "{"||namespace-uri-from-QName($name)||"}"||local-name-from-QName($name) 
}; 

let $doc := document{<a><b/><b/><c xmlns="c.com"/></a>} 
for $node in $doc//* 
group by $name := node-name($node) 
return local:clarkName($name) || ":" || count($node) 

(シリアライズ方法に応じて、未定義の順序で)出力:ここ

+1

QNamesにdistinct-values()を直接適用することもできます: '$ names:= distinct-values($ doc // */node-name())'を実行し、表示時にクラーク表記に変換します: ($ node)} –

関連する問題