4

XQuery に配列の組み込みサポートはありますか? たとえば、単純な Java プログラムを xquery に実装する場合、次のようにします。

(プログラム全体を xquery に変換するよう求めているのではなく、以下のコードの行番号 2 の配列を xquery に実装する方法を尋ねているだけですか? marklogic / xdmp 関数も使用しています)。

java.lang.String test = new String("Hello XQuery");
char[] characters = test.toCharArray();

for(int i = 0; i<characters.length; i++) {
    if(character[i] == (char)13) { 
        character[i] = (char) 0x00;
    }
}

Legend:

hex 0x00 dec 0 : null
hex 0x0d dec 13: carriage return
hex 0x0a dec 10: line feed
hex 0x20 dec 22: dquote
4

7 に答える 7

6

サンプル コードを に変換する際の問題はXQuery、配列がサポートされていないことではなく、 x00が で有効な文字ではないことにありますXML。この問題がなければ、単純な関数呼び出しでクエリを表現できます。

translate($input, '&#x13;', '&#x00;')

これは不正行為であると主張することができます。これは、手動でやろうとしていることを正確に実行する関数が存在するためです。しかし、この関数が存在しない場合は、XQuery. 必要な場合 (ほとんど必要ありません)、 function を使用して文字列を整数のシーケンスに変換し、シーケンスを操作するためstring-to-codepoints()のすべての機能を利用できXQueryます。

教訓は、XQueryやのような宣言型言語を使用するときは、より原始的な言語で使用することを余儀なくされたのと同じ低レベルのプログラミング手法XSLTを使用しようとしないことです。通常、問題をより直接的に表現する方法があります。

于 2012-12-20T08:44:48.533 に答える
3

XQuery には、シーケンスのサポートが組み込まれています。関数tokenize()(@harish.ray で提案) はシーケンスを返します。中かっことコンマを使用して自分で作成することもできます。

let $mysequence = (1, 2, 3, 4)

シーケンスは順序付きリストなので、それに頼ることができます。これは、から返されるノード セットとは少し異なります。XPathこれらは通常、ドキュメント順です。

余談ですが、実際には、XQuery のすべてはnode-setまたはsequenceのいずれかです。関数が 1 つの string または int を返すように宣言されている場合でも、その戻り値を 1 つの項目のシーケンスであるかのように扱うことができます。いずれにせよ、XQuery には構造体がないため、明示的なキャストは必要ありません。のような機能は常に機能fn:exists()します。fn:empty()

チッ!

于 2012-12-20T07:26:04.243 に答える
2

楽しみのために、fn:translate存在しなかった場合にXQueryでこれを行う方法を次に示します。マイケル・ケイの提案は似たようなものになると思います。

let $test := "Hello XQuery"
return codepoints-to-string(
  for $c in string-to-codepoints($test)
  return if ($c eq 32) then 44 else $c)

彼が指摘した問題のために変換を変更したことに注意してください。0は正当なコードポイントではありません。そこで、代わりにスペースをコンマに変換しました。

MarkLogicの別のオプションは、http: //docs.marklogic.com/json:arrayとそれに関連する関数を使用することです。このjson:set-item-at関数を使用すると、漠然と命令型のコーディングが可能になります。両方のバリエーションをコーディングすることは、良い学習演習になる可能性があります。

于 2012-12-20T18:39:58.450 に答える
0

これには 2 つの方法があります。

  • まず、XmlManager.createResults() を使用して XmlResults オブジェクトを作成し、XmlResults.add() を使用してこれに文字列を追加します。その後、XmlResults オブジェクトを使用して、クエリで使用できる XmlQueryContext の変数の値を設定できます。

    例:

    XmlResults values = XMLManager.createResults();
    values.add(new XmlValue("value1"));
    values.add(new XmlValue("value2"));
    XmlQueryContext.setVariableValue("files", values);
    
  • 別の方法は、XQuery で文字列を分割することです。tokenize() 関数を使用してこれを行うことができます。この関数は、正規表現を使用して文字列セパレーターと一致させます。

    http://www.w3.org/TR/xpath-functions/#func-tokenize

ありがとう。

于 2012-12-20T06:33:23.467 に答える
0

次のような配列を作成できます。

$myArray = tokenize('a b c d e f g', '\s')
// $myArray[3] -> c 

この疑似配列の最初のインデックスは 0 ではなく 1 であることに注意してください。

于 2014-11-25T13:58:23.130 に答える