0

32 ビット文字列変数を置き換えようとしています。最初は、すべての値が「0」です。

$bitmask:="00000000000000000000000000000000"

いくつかのインデックス値があり、これらのインデックスの値を「1」に置き換える必要があります。

たとえば、インデックス値 = (3,10) があります。

期待される結果は次のとおりです。

$bitmask:="00100000010000000000000000000000"

実際に私はそれをしました:)しかし、私のビットマスク値にはスペース文字があります。スペース文字を削除できませんでした。

私の作業コード;

$serviceBits :=  tokenize('0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0',',')

<services>
{
for $t at $pos in $serviceBits
let  $temp := ''
return 
 if($pos = data($myElement/ns:position)) then
   concat($temp, '1')
 else  
   replace(concat($temp, $t)," ","")    
}
</services>

そして、私の作業コードの結果は次のとおりです。

<services>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0</services>
4

1 に答える 1

1

コードの問題は、新しく構築された要素にシーケンスを投稿し、間にスペースを入れてシリアル化することです。ここで明示的に使用string-joinします。

<services>{
  string-join(
    (: all the other code for modification :),
    '' (: Nothing between the individual strings :)
  )
}</services>

とにかく、あなたの通話がどこに接続されtokenizeているのかわかりません。$bitmap

配列をシーケンスに変換し、いくつかの値を調整して文字列を再度返すには、string-to-codepointsそれぞれ逆関数を使用します。Unicode コードポイントを返します。0 から 1 に変更するには、1 を追加するだけです。例:

let $bitmask := '00000000000000000000000000000000'
return
  codepoints-to-string(
    for $char at $i in string-to-codepoints($bitmask)
    return
      if ($i = (3,10))
        then $char + 1
        else $char
  )
于 2013-10-01T13:26:48.003 に答える