查询 XML 数据库外的 XML 文档
2010-10-22 17:19:23 来源:WEB开发网这个查询的结果是:
<results>
<result>
<project-name>XML Zen</project-name>
<version library="log4j">1.2.14</version>
</result>
<result>
<project-name>Crank :: ROOT</project-name>
<version library="log4j">1.2.13</version>
</result>
</results>
注意等于号(=)和 eq 操作符之间的区别。eq 操作符只能用于比较原子值。如果您使用它来比较一个项目系列,那么代码将出现错误。而 = 号则能用于比较序列。只需记住:每个 eq 操作符都可能出现错误,您只有在相当确信处理的是原子值时才能使用它。
最后一个示例包含一个额外的 for 循环和一个额外的变量 $artifactId。这个额外变量用于避免副本,事实证明,它将在下一步中以另一种方式带来好处。没有规则限制使用额外的 for 循环。但是,好的实践方法是:如果可能,尽量避免使用它们,从而保持代码简练。
但在某些情况下,一个额外的 for 循环则意味着大量附加值。例如,假如您想要将一些 JUnit 版本添加到查询结果。这只需一个微小的更改,如 清单 9 所示。
清单 9. 确定使用的是哪些 JUnit 版本
declare namespace m = "http://maven.apache.org/POM/4.0.0";
let $docs := (doc("http://q4e.googlecode.com/svn/trunk/pom.xml"),
doc("http://gmaps4jsf.googlecode.com/svn/trunk/pom.xml"),
doc("http://java-twitter.googlecode.com/svn/trunk/pom.xml"),
doc("http://xmlzen.googlecode.com/svn/trunk/pom.xml"),
doc("http://krank.googlecode.com/svn/trunk/pom.xml"))
let $artifactIds := ('log4j', 'junit')
return <results>
{
for $doc in $docs[//m:artifactId = $artifactIds]
let $name := $doc/m:project/m:name/text()
return
<result>
<project-name>{$name}</project-name>
{
for $artifactId in $artifactIds
let $versions := distinct-values($doc//m:dependency[m:artifactId
eq $artifactId]/m:version)
for $version in $versions
return <version library="{$artifactId}">{$version}</version>
}
</result>
}
</results>
更多精彩
赞助商链接