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

how to iterate dynamically over child elements using for in xquery

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

<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>

每次修改<th><td>,共同的是根元素源代码。谁能帮我循环迭代这些元素并以 table 格式表示这些数据?

我不完全理解你的说法。您希望能够合并所有此类 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>

您可以试试这个,但是不同值的方法不能很好地扩展。您最好预先确定列,然后像 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>

HTH!