WEB开发网
开发学院WEB开发Xml 查询 XML 数据库外的 XML 文档 阅读

查询 XML 数据库外的 XML 文档

 2010-10-22 17:19:23 来源:WEB开发网   
核心提示: 这个查询的结果是:<results><result><project-name>XMLZen</project-name><versionlibrary="log4j">1.2.14</version>&

这个查询的结果是:

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

上一页  5 6 7 8 9 10 

Tags:查询 XML 数据库

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接