Xpath 如何在xquery中使用for动态迭代子元素

Xpath 如何在xquery中使用for动态迭代子元素,xpath,xquery,marklogic,Xpath,Xquery,Marklogic,我有一个包含多个XML文档的XML文件。在大型XML文档中,每个文档都有一个根节点,该节点对于该文件中的所有XML文档都是通用的。但是,根名称中的子元素各不相同。我必须编写一个for循环来动态迭代每个子节点,并且必须在表格式上显示它。这里我将我的XML格式粘贴到下面。我有多个这样的xml文件,但根节点对于每个文件都是通用的。我希望将每个子元素映射为表行,将数据映射为表列。子元素的数量会有所不同 <source> <empname>john </empname&g

我有一个包含多个XML文档的XML文件。在大型XML文档中,每个文档都有一个根节点,该节点对于该文件中的所有XML文档都是通用的。但是,根名称中的子元素各不相同。我必须编写一个for循环来动态迭代每个子节点,并且必须在表格式上显示它。这里我将我的XML格式粘贴到下面。我有多个这样的xml文件,但根节点对于每个文件都是通用的。我希望将每个子元素映射为表行,将数据映射为表列。子元素的数量会有所不同

<source>
  <empname>john </empname>
  <empid>25825   </empid>
  <salary> 20000 </salary>
  <dob> 12-08-1993</dob>
</source>
<source>
  <empname>joe</empname>
  <empid>25826</empid>
  <salary>20000</salary>
  <dob>12-07-1993</dob>
<source>

<source>
  <emptype>developer</emptype>
  <address>3155 </address>
  <mobile>58258365</mobile>
</source>
<source>
  <emptype>analyst</emptype>
  <address>3155 </address>
  <mobile>58258365</mobile>
</source>

<table>
  <th>  empname    empid   salary   dob </th>
  <td>     john       25825  60000    date</td>
  <td>     joe        25826  70000    date</td>
</table>

厕所
25825
20000
12-08-1993
乔
25826
20000
12-07-1993
开发商
3155
58258365
分析师
3155
58258365
empname empid工资dob
约翰25825 60000日期
乔25826 70000日期

每次更改
时,常见的是根元素源代码。有谁能帮我在循环中迭代这些元素并在表格式中表示这些数据吗?

我不完全理解你的说法。是否希望能够合并所有此类XML文件?这个怎么样

<table>
<tr><th>empname</th><th>empid</th><th>salary</th><th>dob</th>   <th>emptype</th></tr>
{for $child in doc("your-file")/source) 
return <tr>{    
return <td>{$child/empname}</td><td>{$child/empid}</td><td>{$child/salary}</td><td>{$child/dob}</td><td>{$child/emptype}</td>
}</tr></table>

empnameempidsalarydob emptype
{对于文档中的$child(“您的文件”)/source)
返回{
返回{$child/empname}{$child/empid}{$child/salary}{$child/dob}{$child/emptype}
}

您可以尝试此方法,但不同值的方法不能很好地扩展。您最好预先确定列,并像Tavolo的解决方案那样硬编码:

let $xml := 
  <sources>
    <source>
      <empname>john </empname>
      <empid>25825   </empid>
      <salary> 20000 </salary>
      <dob> 12-08-1993</dob>
    </source>
    <source>
      <empname>joe</empname>
      <empid>25826</empid>
      <salary>20000</salary>
      <dob>12-07-1993</dob>
    </source>
    <source>
      <emptype>developer</emptype>
      <address>3155 </address>
      <mobile>58258365</mobile>
    </source>
    <source>
      <emptype>analyst</emptype>
      <address>3155 </address>
      <mobile>58258365</mobile>
    </source>
  </sources>
let $sources := $xml/source
let $labels := fn:distinct-values($sources/*/fn:node-name(.))
return
  <table>
    <tr>{
      for $label in $labels
      return <th>{ $label }</th>
    }</tr>
    {
      for $source in $sources
      return <tr>{    
        for $label in $labels
        return <th>{ fn:data($source/*[fn:node-name() = $label]) }</th>
      }</tr>
    }
  </table>
let$xml:=
厕所
25825
20000
12-08-1993
乔
25826
20000
12-07-1993
开发商
3155
58258365
分析师
3155
58258365
让$sources:=$xml/source
let$labels:=fn:distinct值($sources/*/fn:node name()
返回
{
对于$label中的$label
返回{$label}
}
{
在$sources中查找$source
返回{
对于$label中的$label
返回{fn:data($source/*[fn:node-name()=$label])}
}
}

HTH!

格式是正确的。但是,我的表头是源代码的子元素,它们不是硬编码的值。其次,我的表数据是源代码的子元素值。我需要一个通用代码。它只是一个xml格式的示例文件,非常有帮助。我如何尝试在代码中实现这一点,我得到了解析器ror:要检索的元素太多。您能帮我指定一些其他功能或修改此代码吗?