отдельные элементы с тегами в переменной [Xquery] - PullRequest
0 голосов
/ 21 мая 2019

Прежде всего, я совершенно новый в Xquery, и мне жаль, что моя проблема очень глупа: /.

Это только часть моего XML:

<books>
    <book id="b1">
      <title>Set theory and the continuum problem</title>
      <category>Mathematics</category>
      <location>
        <area>hall1</area>
        <case>1</case>
        <shelf>2</shelf>
      </location>
      <description>A lucid, elegant, and complete survey of set theory.</description>
      <history>
        <borrowed by="m4"/>
        <borrowed by="m2" until="2018-04-05"/>
      </history>
    </book>
    <book id="b2">
      <title>Computational Complexity</title>
      <isbn>978-0201-530-827</isbn>
      <category>Computer Science</category>
      <location>
        <area>hall1</area>
        <case>3</case>
        <shelf>3</shelf>
      </location>
      <description>.</description>
    </book>
    <book id="b3">
      <title>To mock a mockingbird</title>
      <isbn>1-292-09761-2</isbn>
      <category>Logic</category>
      <category>Mathematics</category>
      <location>
        <area>hall1</area>
        <case>1</case>
        <shelf>3</shelf>
      </location>
      <description>.</description>
     </book>
</books>
 <libraryArea floor="1" name="hall1">
    <bookcases>
      <woodenCase id="3" shelves="5"/>
      <woodenCase id="2" shelves="5"/>
      <steelCase id="1" shelves="5"/>
    </bookcases>
  </libraryArea>
  <libraryArea name="hall2">
    <bookcases>
      <lockedCase id="1" shelves="9"/>
      <steelCase id="4" shelves="3"/>
      <lockedCase id="3" shelves="2"/>
      <steelCase id="2" shelves="4"/>
    </bookcases>
  </libraryArea>
  <libraryArea name="hall3">
    <bookcases>
      <woodenCase id="2" shelves="3"/>
      <steelCase id="1" shelves="8"/>
    </bookcases>
  </libraryArea>
  <libraryArea name="archive">
    <bookcases>
      <lockedCase id="1" shelves="1"/>
    </bookcases>
  </libraryArea>
</library>

Я хочу перечислить определенные названия книг в их собственных тегах ''

Примерно так:


<specialSteelCases>
   <area name="hall1">
     <steelCase id="1">
        <bookCount>2</bookCount>
        <book>Set theory and the continuum problem</book>
        <book>To mock a mockingbird</book>
        <shelves>5</shelves>
      </steelCase>
   </area>
</specialSteelCases>

Но я понимаю, все названия книг в одном теге:

Теория множеств и проблема континуума. Чтобы издеваться над пересмешником

Есть ли способ, которым я могу разделить их, чтобы у каждого названия книги были свои

Это мой Xquery:

<specialSteelCases>
{
for $a in //libraryArea
where $a/bookcases[count(woodenCase) > 1 ]
order by $a/@id
return
    <area name="{$a/@name}">
    {
        for $s in $a//bookcases/steelCase
        let $bbNew := (//books/book[location/case=$s/@id][location/area=$a/@name])
        return
           <steelCase id="{$s/@id}">
                <bookCount>***code***</bookCount>
                <book>{$bbNew/title/text()}</book>
                <shelves>***code**</shelves>
           </steelCase>
    }
    </area> 
}
</specialSteelCases>

1 Ответ

0 голосов
/ 21 мая 2019

Используйте предложение let, чтобы выбрать соответствующие книги, а затем сосчитать их и дополнительно с вложенным выражением for вывести заголовки:

<specialSteelCases>
{
for $a in //libraryArea
where $a/bookcases[count(woodenCase) > 1 ]
order by $a/@id
return
    <area name="{$a/@name}">
    {
        let $books := //books/book[location/case=$a//bookcases/steelCase/@id][location/area=$a/@name]
        return
           <steelCase id="{$a//bookcases/steelCase/@id}">
                <bookCount>{count($books)}</bookCount>
                {
                    for $title in $books/title
                    return
                        <book>{data($title)}</book>
                }
           </steelCase>
    }
    </area> 
}
</specialSteelCases>

https://xqueryfiddle.liberty -development.net/ jyyiVhw / 1

Если вы можете перейти на XQuery 3 и просто группировать:

for $book in //books/book
group by $case := //library/libraryArea[@name = $book/location/area]/bookcases/*[@id = $book/location/case]/local-name()
return
    element {$case } {
        <bookCount>{count($book)}</bookCount>
        ,
        $book/title ! <book>{data()}</book>
    }

https://xqueryfiddle.liberty -development.net / jyyiVhw

...