Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XQuery嵌套循环的自动增量辅助索引变量(w.动态计数)_Xml_Loops_Iteration_Xquery_Counter - Fatal编程技术网

Xml XQuery嵌套循环的自动增量辅助索引变量(w.动态计数)

Xml XQuery嵌套循环的自动增量辅助索引变量(w.动态计数),xml,loops,iteration,xquery,counter,Xml,Loops,Iteration,Xquery,Counter,我想要的是一个解决方案,它可以帮助您理解如何在xQuery中以Java的形式保存一个真正的循环计数器,而不是解决我特定的简化演示的问题。我知道在XQuery3.0中,Flower结构有一个计数保留字,但它在Saxon 9.0之前是无用的。这里是我的例子 for $elem at $x in /Data/* return element Elem { attribute Name {concat('_',$x,'.',name($elem))},

我想要的是一个解决方案,它可以帮助您理解如何在xQuery中以Java的形式保存一个真正的循环计数器,而不是解决我特定的简化演示的问题。我知道在XQuery3.0中,Flower结构有一个计数保留字,但它在Saxon 9.0之前是无用的。这里是我的例子

     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...)
输出如下(隐藏和简化真实数据)



这是前一个问题的扩展,我接受了xQuery 3.0计数器的解决方案,然后提出了一个手动执行的替代方案。但是我知道,我认为观点是不同的,更具体的,并且有一个新的例子。如果你认为应该删除,就告诉我

您可以做的是在嵌套迭代的结果序列上添加一个额外的过程,即

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处理器可以在不具体化序列的情况下对结果进行流式处理。

新问题-新答案

但原则是一样的:首先生成一个未编号的结果,然后应用编号。这可能需要重写结果

插入代码,而不是下面的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())
声明函数本地:重新编号($number,$string)
{
替换($string,'这就是我要找的',string($number))
};
声明函数本地:重新编号($subSubElems,$number,$nodes)
{
对于$node中的$node
返回
类型开关($node)
case attribute()返回属性{node name($node)}{local:renumber($number,$node)}
case processing-instruction()返回处理指令{name($node)}{local:renumber($number,$node)}
case comment()返回注释{local:renumber($number,$node)}
case text()返回文本{local:renumber($number,$node)}
默认(:element():)返回
元素{node name($node)}
{
本地:重新编号
(
$subelems,

如果($subSubElems[.is$node]),那么计算($subSubElems[.这个问题很模糊——请编辑问题并提供完整的答案(但尽可能小)示例:XML文档,确切的想要的结果,查询必须实现的要求。user1352530:如果问题是具体的,我可以帮助您——因为它是一般性的,并且必须进行大量猜测(并且对这种猜测的正确性没有信心)在构建一个演示示例来展示该技术时。user1352530:我发现这个问题根本不能说明您想要表达的实际问题——这个特定问题有一个非常简单的解决方案——只需输出数字1到N,其中N是所有非空白字符的计数。如您所见,这个“演示”太简单了,没有给我们提供任何问题的定义。我仍然不确定你到底想要什么。你没有一个具有代表性的例子,这可能意味着你没有清楚地理解问题是什么。换言之,这是一个“问题”不存在的特定示例不是问题。最后一次编辑清楚地显示了您想要的内容,并且您想要的东西这一事实并不意味着存在任何问题来解决所需的功能。我现在更加确信,这个问题不是基于任何实际问题。我的预测是,您向我们展示的任何问题对想要的功能的支持,将有一个没有此功能的解决方案。但这取决于你来证明我的错误:)这是一个非常好的主意!但它有一个重要的缺点。你不能在当前迭代中使用计数器,这是90%的使用率。这将类似于将计数器传递给计数()。谢谢!好的,将外部return子句替换为
return concat($letestotal,“ºis”,“$letter,”)
。对于单个结果字符串,请将完整表达式包装在
字符串联接(
,“”)中
。这会满足您的需要。谢谢,我很抱歉我的解释不好,但是有没有办法从循环内部实现这一点。比如,如果我每次都想从最后一个循环打印它:1a,1a 2b,1a 2b 3c…例如,不,没有这样的功能。哇,作为替代解决方案,它可以很好地工作。谢谢!!我会尽可能长地使用它re不是更好的更简单的计数器选项!
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())