这个xquery脚本中的语法错误是什么?

时间:2010-06-21 16:25:04

标签: xquery

我是XQuery的初学者,尝试做一些简单的练习来学习它。但是我试图放在一起的这个最新查询拒绝运行,给我一个语法错误。

这是我的XQuery:

<HTML>
<HEAD><TITLE>Alphabetical Cities Lists</TITLE></HEAD>
<BODY>
{
  for $indcode in (65 to 70)
  let $indlet := codepoints-to-string($indcode)
  return 
     <H1> {$indlet} LIST </H1>
     {
       for $cit in doc("mydoc.xml")/CITIES/ENTITY
       where starts-with($cit/NAME,$indlet)
       order by $cit/NAME
       return <LI>{$cit/NAME}</LI>
     }
     </OL>
} 
</BODY>
</HTML>

这是我的XML文件mydoc.xml的一个子集:

<CITIES>
  <ENTITY>
    <NAME>Hastings</NAME>
    <CITYCOD>230</CITYCOD>
    <CNTYCOD>01</CNTYCOD>
  </ENTITY>
  <ENTITY>
    <NAME>Tilden</NAME>
    <CITYCOD>487</CITYCOD>
    <CNTYCOD>02</CNTYCOD>
  </ENTITY>
  <ENTITY>
    <NAME>Alliance</NAME>
    <CITYCOD>008</CITYCOD>
    <CNTYCOD>07</CNTYCOD>
  </ENTITY>
  <ENTITY>
    <NAME>Hemingford</NAME>
    <CITYCOD>236</CITYCOD>
    <CNTYCOD>07</CNTYCOD>
  </ENTITY>
  <ENTITY>
    <NAME>Ainsworth</NAME>
    <CITYCOD>003</CITYCOD>
    <CNTYCOD>09</CNTYCOD>
  </ENTITY>
  <ENTITY>
    <NAME>Kearney</NAME>
    <CITYCOD>269</CITYCOD>
    <CNTYCOD>10</CNTYCOD>
  </ENTITY>
  <ENTITY>
    <NAME>Oakland</NAME>
    <CITYCOD>358</CITYCOD>
    <CNTYCOD>11</CNTYCOD>
  </ENTITY>
  <ENTITY>
    <NAME>Eagle</NAME>
    <CITYCOD>159</CITYCOD>
    <CNTYCOD>13</CNTYCOD>
  </ENTITY>
</CITIES>

我想要它做的是打印一个简单的HTML文档,其中包含这些城市名称的几个列表,按照它们开头的字母(A到F)进行细分。

但是当我尝试在this site上运行时,它会给我这个错误:

查询:&lt;&gt;,第9行,第6列:[XPST0003]语法错误,意外“'{'”,期待“'}'”

我不知道为什么会这么说。我检查过并检查过,但我的花括号看起来都很合适。任何人都可以看到问题是什么?感谢。

2 个答案:

答案 0 :(得分:3)

这是一个常见的错误。

您需要在<H1><OL>节点之间放置一个。

单个节点是XQuery表达式(直接元素构造函数中的多个节点也是如此)。返回表达式必须是表达式。在这种情况下,您希望返回两个节点。每个节点都是一个项目,因此为了返回它们,您需要在一个序列中连接两个节点。

查询如下所示:

<HTML>
<HEAD><TITLE>Alphabetical Cities Lists</TITLE></HEAD>
<BODY>
{
  for $indcode in (65 to 70)
  let $indlet := codepoints-to-string($indcode)
  return 
     (<H1> {$indlet} LIST </H1>,
     <OL>
     {
       for $cit in doc("mydoc.xml")/CITIES/ENTITY
       where starts-with($cit/NAME,$indlet)
       order by $cit/NAME
       return <LI>{$cit/NAME}</LI>
     }
     </OL>)
} 
</BODY>
</HTML>

答案 1 :(得分:1)

你忘记了&lt; OL&gt;在{第9行。

之前

所以它应该是:

<HTML>
<HEAD><TITLE>Alphabetical Cities Lists</TITLE></HEAD>
<BODY>
{
  for $indcode in (65 to 70)
  let $indlet := codepoints-to-string($indcode)
  return 
     <H1> {$indlet} LIST </H1>
     <OL>
     {
       for $cit in doc("mydoc.xml")/CITIES/ENTITY
       where starts-with($cit/NAME,$indlet)
       order by $cit/NAME
       return <LI>{$cit/NAME}</LI>
     }
     </OL>
} 
</BODY>
</HTML>