Как подсчитать узлы XML, которые начинаются с определенной строки, используя XQuery? - PullRequest
1 голос
/ 25 января 2012

У меня есть следующий XML:

<prescriptions>
  <prescription id="1" amka="1">
    <status>closed</status>
    <doctor_info>
      <amka>111111</amka>
      <doc_code> 123</doc_code>
      <name> chris</name>
      <surname>st</surname>
      <specialization>path</specialization>
      <hospital>401</hospital>
    </doctor_info>
    <patient_info>
      <amka>1</amka>
      <genre>man</genre>
      <name>elton </name>
      <surname>kev</surname>
      <age>28</age>
      <adress>aaa123</adress>
      <home_phone>210</home_phone>
      <cell_phone>69</cell_phone>
      <email>aaa@aaa.com</email>
      <insurance>diom</insurance>
    </patient_info>
    <main_prescription>
      <type>eee</type>
      <epanalipseis>2</epanalipseis>
      <date>21/1/2012</date>
      <comms>blablabla</comms>
      <diagnosh>kkkk</diagnosh>
      <drug1>
        <onoma>prezza</onoma>
        <drastikh_ousia>llll</drastikh_ousia>
        <posotita>12</posotita>
        <dosologia>
          <arithmos_hapion>5</arithmos_hapion>
          <ores>2</ores>
          <hmeres>21</hmeres>
        </dosologia>
        <simetoxi>25%</simetoxi>
        <tropos_xorigisis>ass</tropos_xorigisis>
        <cost>100</cost>
      </drug1>
      <drug2>
        <onoma>prezza</onoma>
        <drastikh_ousia>llll</drastikh_ousia>
        <posotita>12</posotita>
        <dosologia>
          <arithmos_hapion>5</arithmos_hapion>
          <ores>2</ores>
          <hmeres>21</hmeres>
        </dosologia>
        <simetoxi>25%</simetoxi>
        <tropos_xorigisis>ass</tropos_xorigisis>
        <cost>100</cost>
      </drug2>
      <drug3>
        <onoma>prezza</onoma>
        <drastikh_ousia>llll</drastikh_ousia>
        <posotita>12</posotita>
        <dosologia>
          <arithmos_hapion>5</arithmos_hapion>
          <ores>2</ores>
          <hmeres>21</hmeres>
        </dosologia>
        <simetoxi>25%</simetoxi>
        <tropos_xorigisis>ass</tropos_xorigisis>
        <cost>100</cost>
      </drug3>
      <total_cost>100</total_cost>
      <prospou>nosokomeio</prospou>
      <drug_comms>ablablabla</drug_comms>
    </main_prescription>
  </prescription>
</prescriptions>

В <main_prescription> узле у меня есть 3 узла для лекарств: <drug1> , <drug2> и <drug3>.

Есть ли способ подсчитать, сколько узлов называют <drug...>, используя XQuery?

Я использую XQuery ниже, но это неправильно:

select prescriptions.query('count(/prescriptions/prescription/main_prescription/drug[*])') as one1 from prescription

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Требуемые узлы могут быть выбраны даже с помощью выражения XPath 1.0 :

/*/*/main_prescription
      /*[starts-with(name(), 'drug')
       and
          substring-after(name(), 'drug')
         =
          floor(substring-after(name(), 'drug'))
        ]

Выбирает все элементы, которые :

  1. являются дочерними элементами элемента main_prescription, который является потомком верхнего элемента документа и:

  2. имеют имя, начинающееся со строки "drug"а оставшаяся строка после "drug" является целым числом.

Пояснение :

  1. Правильное использование функций starts-with(), name() и substring-after().

  2. Использование факта, что выражение floor($x) = $x оценивается как true() точно, когда строковое значение $x представляет целое число.

0 голосов
/ 25 января 2012

Попробуйте это.

'count (/ prescription / prescription / main_prescription / * [соответствует (name (),' '^ drug [0-9] + $' ')])

Здесь мы выбираем все узлы, которые имеют имена узлов как «препарат» и заканчиваются целым числом.

Подробнее о функциях xpath можно узнать по ссылке ниже.http://www.w3schools.com/Xpath/xpath_functions.asp

...