Been trying to write an xquery code that converts a flat xml to 5-level hierarchy xml file

StackOverflow https://stackoverflow.com/questions/18662706

Вопрос

Would like to convert the following flax xml file to 5-level hierarchy xml structure using xquery, so far the all the xquery code i have written did not work.

<data>
<row>
    <Year>1999</Year>
    <Quarter>8</Quarter>
    <Month>5</Month>
    <Week>10</Week>
    <Flight>6/11/1995</Flight>
    <Un>WN</Un>
    <Air>193</Air>

</row>
<data>

Out result i would like:

<data>
   <row>
     <Year>
            <value>1999</value>
            <Quarter>
                <value>8</value>
                <Month>
                    <value>5</value>
                    <Week>10</Week>
                    <Flight>6/11/1995</Flight>
                    <Un>WN</Un>
                    <Air>193</Air>
                </Month>
            </Quarter>
        </Year>
    </row>
<data>
Это было полезно?

Решение

It's unclear what XQuery processor you're using, or the exact schema of the data you will need to process, but here is an example of how to transform the data, assuming each row contains a unique set of entries:

let $data :=
    <data>
    <row>
        <Year>1999</Year>
        <Quarter>8</Quarter>
        <Month>5</Month>
        <Week>10</Week>
        <Flight>6/11/1995</Flight>
        <Un>WN</Un>
        <Air>193</Air>    
    </row>
    </data>    
for $row in $data/row
return 
    element row {
      element Year {
        element value { $row/Year/data() },
        element Quarter {
          element value { $row/Quarter/data() },
          element Month {
            element value { $row/Month/data() },
            $row/Week,
            $row/Flight,
            $row/Un,
            $row/Air
          }
        }
      }
    }

Другие советы

If you want a single element for each year/quarter/month, use this code:

<data>
  <row>{
    for $year in //row/Year/data()
    return
      <Year>{
        <value>{ $year }</value>,
        for $quarter in //row[Year=$year]/Quarter/data()
          return
            <Quarter>{
              <value>{ $quarter }</value>,
              for $row in //row[Year=$year and Quarter=$quarter]
              return
                <Month>{
                  <value>{ Month/data() }</value>,
                  $row/*[not(local-name(.) = ('Month', 'Quarter', 'Year'))]
                }</Month>
            }</Quarter>
      }</Year>
  }</row>
</data>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top