0

特定の簡略化されたデモの回避策ではなく、xQueryで実際のループカウンターをJavaとして保持する方法を理解するためのソリューションが必要です。xQuery 3.0には、FLOWR構造体に予約語が含まれていることは知っていますが、Saxon9より前の機能はありません。ここに私の例があります。

     for $elem at $x in /Data/* return element Elem {       
            attribute Name   {concat('_',$x,'.',name($elem))},      
            (: ...10 lines of code... :)        
            for $subelem at $y in $elem/*       
            (: ...5 lets... :)      
            return element SubElemen {
               attribute Name {concat('_',$x,'.',$y,'_',name($subelement))},
               (...20 lines of other attrs and elements ...)
           for $subsubelem at $z in $subElem/SubSubElement
               let $absIterIndex := 'THIS IS WHAT IM LOOKING'
               let $subSubElemName := concat('_',$absIterIndex,'_',name($subElem))
            return
                                 element SubSubElem {
                 attribute Name {$subsubelem}, 
                   (..100 lines more playing with $x, $y, $absIterIndex, all lets for that iteration, attributes depending on them...)

出力は次のようになります(実際のデータは非表示で簡略化されています)

 <Elem Name="_1.Name">
      <SubElem Name="_1.1_Name">
           <SubSubElem Name="_1.First"/>
           <SubSubElem Name="_2.Second"/>
           <SubSubElem Name="_3.Third"/>
      </SubElem Name="_1.1_Name">
      <SubElem Name="_1.2_Name">
           <SubSubElem Name="_4.Fourth"/>
           <SubSubElem Name="_5.Fifth"/>
           <SubSubElem Name="_6.Sixth"/>
           <SubSubElem Name="_7.Seventh"/>
      </SubElem Name="_1.1_Name">
  <Elem Name="_2.Name">
      <SubElem Name="_2.1_Name">
           <SubSubElem Name="_8.Eighth"/>
           <SubSubElem Name="_9.Ninth"/>
           <SubSubElem Name="_10.Tenth"/>
           <SubSubElem Name="_11.Eleventh"/>
      </SubElem Name="_2.1_Name">
      <SubElem Name="_2.2_Name"/>
  </Elem Name="_2.Name">
  <Elem Name="_3.Name">
      <SubElem Name="_3.1_Name">
           <SubSubElem Name="_12.Twelven"/>
      </SubElem Name="_3.1_Name">
      <SubElem Name="_3.2_Name"/>
  </Elem Name="_3.Name">     

これは、前の質問の拡張です。XQueryのネストされたループの自動インクリメンタル補助インデックス変数。xQuery3.0カウンターのソリューションを受け入れ、手動で実行するための代替案を提案します。しかし、私は視点が異なり、より具体的であり、新しい例があると思います。削除する必要があると思われる場合は、教えてください。

4

2 に答える 2

1

できることは、ネストされた反復の結果シーケンスにパスを追加することです。

declare variable $script := 'abc defg h ijklm nop 
                                 qrs tu vw
                                 xy z';
for $letter at $lettersTotal in
(
  for $line at $numLine in tokenize($script, '(\r\n?|\n\r?)')
  for $word at $numWord in tokenize(normalize-space($line),' ')
  for $codepoint at $numLetter in string-to-codepoints($word)
  return codepoints-to-string($codepoint)
)
return ($lettersTotal, $letter)

これは

1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j 11 k 12 l 13 m 14 n 15 o 16 p 17 q 18 r 19 s 20 t 21 u 22 v 23 w 24 x 25 y 26 z

運が良ければ、XQueryプロセッサはシーケンスを具体化せずに結果をストリーミングできます。

于 2012-07-03T21:27:51.063 に答える
0

新しい質問-新しい答え。

ただし、原則は同じです。最初に番号のない結果を生成してから、番号を適用します。これには、結果の書き換えが必要になる場合があります。

以下のXMLコメントの代わりにコードを挿入してください。

declare function local:renumber($number, $string)
{
  replace($string, 'THIS IS WHAT IM LOOKING', string($number))
};

declare function local:renumber($subSubElems, $number, $nodes)
{
  for $node in $nodes
  return
    typeswitch ($node)
    case attribute()              return attribute {node-name($node)} {local:renumber($number, $node)}
    case processing-instruction() return processing-instruction {name($node)} {local:renumber($number, $node)}
    case comment()                return comment {local:renumber($number, $node)}
    case text()                   return text {local:renumber($number, $node)}
    default (: element() :) return
      element {node-name($node)}
      {
        local:renumber
        (
          $subSubElems, 
          if ($subSubElems[. is $node]) then count($subSubElems[. << $node]) + 1 else $number, 
          ($node/@*, $node/node())
        )
      }
};

let $result := <result>{<!-- your code here -->}</result>
return local:renumber($result//SubSubElem, 0, $result/node())
于 2012-07-05T11:26:43.260 に答える