Мой xquery не использует "count" должным образом - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь разработать запрос для XML-файла, в котором я хочу подсчитать число calib, полученное при $y/colheita/cod_colheita="FE23569" and $y/colheita/@ano="2018", и я пытаюсь вернуть счет return count($y/colheita/lotes/lote/calibragem/calib)

Я не понимаю, почему я не возвращаю количество калибровок.

XML-файл

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style_macaMoimenta.xsl"?>
<moimenta xmlns="http://www.macamoimenta.pt/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:gnr="http://www.macamoimenta.pt/general" xmlns:clt="http://www.macamoimenta.pt/lote"
xmlns:prc="http://www.macamoimenta.pt/precario"
xmlns:clb="http://www.macamoimenta.pt/calibragem"
xsi:schemaLocation="http://www.macamoimenta.pt/ moimenta.xsd">
<produtores>
    <produtor>
        <codigo>PR001</codigo>
        <nome>Antonio Manuel</nome>
        <data_registo>2018-03-20</data_registo>
        <morada>
            <gnr:rua>Rua Antonio Manuel</gnr:rua>
            <gnr:numero>69</gnr:numero>
            <gnr:cod_postal>4569-123</gnr:cod_postal>
        </morada>
        <colheita ano="2018" qualidade="Ambrosia">
            <cod_colheita>FE23569</cod_colheita>
            <valor>
                <prc:preco_valor valor="0-60">
                    <prc:preco>0.10</prc:preco>
                </prc:preco_valor>
                <prc:preco_valor valor="60-65">
                    <prc:preco>0.13</prc:preco>
                </prc:preco_valor>
                <prc:preco_valor valor="65-70">
                    <prc:preco>0.17</prc:preco>
                </prc:preco_valor>
                <prc:preco_valor valor="DEFEITO">
                    <prc:preco>0.05</prc:preco>
                </prc:preco_valor>
            </valor>
            <lotes>
                <lote>
                    <clt:n_lote>236598</clt:n_lote>
                    <clt:quantidade>2500</clt:quantidade>
                    <clt:calibragem>
                        <clb:calib valor="0-60">
                            <clb:quantidade>1000</clb:quantidade>
                        </clb:calib>
                        <clb:calib valor="60-65">
                            <clb:quantidade>1300</clb:quantidade>
                        </clb:calib>
                        <clb:calib valor="DEFEITO">
                            <clb:quantidade>200</clb:quantidade>
                        </clb:calib>
                    </clt:calibragem>
                </lote>
            </lotes>
        </colheita>
    </produtor>
</produtores>

XQUERY

declare default element namespace "http://www.macamoimenta.pt/";

for $y in /moimenta/produtores/produtor
where $y/colheita/cod_colheita="FE23569" and 
$y/colheita/@ano="2018"
return count($y/colheita/lotes/lote/calibragem/calib)

Мне просто нужно выполнить этот запрос с двумя определителями, cod_colheita="FE23569" и $y/colheita/@ano="2018", и мне нужно, чтобы он возвратил число calib, выполненных внутри этого colheita/lotes/lote

1 Ответ

0 голосов
/ 27 августа 2018

Полагаю, вы хотите сосчитать

count(
  (for $y in /moimenta/produtores/produtor
   where $y/colheita/cod_colheita="FE23569" 
   and $y/colheita/@ano="2018"
   return $y)/colheita/lotes/lote/calibragem/calib
)

или, возможно, короче

count(/moimenta/produtores/produtor/colheita[cod_colheita="FE23569" and @ano="2018"]/lotes/lote/calibragem/calib)

Это должно работать, если все элементы находятся в одном и том же пространстве имен по умолчанию, но поскольку задействованы два других пространства имен, вам нужно больше объявлений пространства имен и использовать префиксы:

declare default element namespace "http://www.macamoimenta.pt/";

declare namespace clt = "http://www.macamoimenta.pt/lote";
declare namespace clb = "http://www.macamoimenta.pt/calibragem";

count(/moimenta/produtores/produtor/colheita[cod_colheita="FE23569" and @ano="2018"]/lotes/lote/clt:calibragem/clb:calib)

https://xqueryfiddle.liberty -development.net / 3Nqn5Y7

Исправление пространства имен также работает для вашей первоначальной попытки после выполнения вызова count для правильного выражения:

declare default element namespace "http://www.macamoimenta.pt/";

declare namespace clt = "http://www.macamoimenta.pt/lote";
declare namespace clb = "http://www.macamoimenta.pt/calibragem";

count(
  (for $y in /moimenta/produtores/produtor
   where $y/colheita/cod_colheita="FE23569" 
   and $y/colheita/@ano="2018"
   return $y)/colheita/lotes/lote/clt:calibragem/clb:calib
)

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

let $colheitas := 
   for $y in /moimenta/produtores/produtor/colheita
   where $y/cod_colheita="FE23569" 
   and $y/@ano="2018"
   return $y
return count($colheitas/lotes/lote/clt:calibragem/clb:calib)

https://xqueryfiddle.liberty -development.net / 3Nqn5Y7 / 1

...