【问题标题】:how to iterate dynamically over child elements using for in xquery如何在 xquery 中使用 for 动态迭代子元素
【发布时间】:2015-04-10 03:53:23
【问题描述】:

我有一个包含多个 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>

每次&lt;th&gt;&lt;td&gt; 发生变化,常见的是根元素源代码。谁能帮我循环遍历这些元素并以表格格式表示这些数据?

【问题讨论】:

    标签: xpath xquery marklogic


    【解决方案1】:

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

    【讨论】:

    • 这真的很有帮助。我如何尝试在我的代码中实现这一点并且我收到解析器错误:要检索的元素太多。您能帮我指定一些其他功能或修改此代码吗?
    【解决方案2】:

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

    【讨论】:

    • 格式正确。但是,我的表头是源代码的子元素,它们不是硬编码值。其次,我的表数据是源代码的子元素值。我需要一个通用代码。它只是一个示例 xml 格式文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多