如何使用XQuery计算以某个字符串开头的XML节点?

时间:2012-01-25 09:37:52

标签: xml xpath xquery

我有以下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>个节点中,我有三个药物节点:<drug1> , <drug2><drug3>

有没有办法使用XQuery计算名称<drug...>的节点数?

我正在使用下面的XQuery,但这是错误的:

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

2 个答案:

答案 0 :(得分:2)

即使使用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"之后的剩余字符串是整数。

  3. <强>解释

    1. 正确使用函数starts-with()name()substring-after()

    2. floor($x) = $x的字符串值表示整数时,使用表达式true()精确计算为$x的事实。

答案 1 :(得分:0)

试试这个。

'count(/ prescriptions / prescription / main_prescription / * [matches(name(),''^ drug [0-9] + $'')])

这里我们选择节点名称为“drug”且以整数结尾的所有节点。

您可以在以下链接上探索有关xpath函数的更多信息。 http://www.w3schools.com/Xpath/xpath_functions.asp