2010-06-21 34 views
1

我是一个初学者的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,它给了我这个错误:

查询:<>,第9行,第6列:[XPST0003]语法错误,意想不到的 “ '{'”,希望“‘}’”

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

回答

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> 
+0

非常感谢。这正是我需要的。并感谢您的详细解释。 – BigBeagle 2010-06-21 17:38:28

1

你忘了<OL>前{上线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> 
+0

谢谢你,你是对的,我做到了。但是,这仍然留下语法错误。 – BigBeagle 2010-06-21 16:39:43