使用xquery从包含名称空间的xml中提取属性值

使用xquery从包含名称空间的xml中提取属性值,xquery,Xquery,我试图在下面的xml文件中提取元素的属性值 <catalog xmlns="http://www.unidata.ucar.edu/namespaces/thredds/InvCatalog/v1.0" xmlns:xlink="http://www.w3.org/1999/xlink" name="TimeSeriesServer THREDDS Catalog"> <service base="http://tsds.net/tsds/" serviceType="

我试图在下面的xml文件中提取元素的属性值

<catalog xmlns="http://www.unidata.ucar.edu/namespaces/thredds/InvCatalog/v1.0" xmlns:xlink="http://www.w3.org/1999/xlink" name="TimeSeriesServer THREDDS Catalog">
    <service base="http://tsds.net/tsds/" serviceType="OpenDAP"/>
    <catalogRef xlink:title="local" xlink:href="test/ncml_catalog.thredds"/>
    <catalogRef xlink:title="remote" xlink:href="http://virbo.org/metamag/viewDataFile.jsp?docname=C6D5623A-ADEC-8397-88A7-DD62A37BA490&amp;filetype=data"/>
</catalog>

而xquery是

declare namespace prefix= "http://www.unidata.ucar.edu/namespaces/thredds/InvCatalog/v1.0";
declare namespace xlink="http://www.w3.org/1999/xlink";

let $xslt:= "/db/virbo/xq/merge/merge.xsl"
let $xml := "/db/virbo/xq/merge/F8ADA960-F16B-5F72-6B09-BE1FE64E5BB1.xml"

return 
   <li>{doc($xml)/prefix:catalog/prefix:catalogRef/@tile}</li>
声明命名空间前缀=”http://www.unidata.ucar.edu/namespaces/thredds/InvCatalog/v1.0";
声明命名空间xlink=”http://www.w3.org/1999/xlink";
让$xslt:=“/db/virbo/xq/merge/merge.xsl”
让$xml:=“/db/virbo/xq/merge/F8ADA960-F16B-5F72-6B09-BE1FE64E5BB1.xml”
返回
  • {doc($xml)/prefix:catalog/prefix:catalogRef/@tile}
  • 它应该给我
    test/ncml\u catalog.thredds
    http://virbo.org/metamag/viewDataFile.jsp?docname=C6D5623A-ADEC-8397-88A7-DD62A37BA490和;文件类型=数据

    但最后一行似乎不起作用,也不知道为什么。感谢您的改进,您的
    @title
    没有在任何命名空间中匹配title属性,但您正在xlink命名空间中查找title元素。将测试更改为
    @xlink:title
    将解决此问题

    路径返回一个属性节点,然后将该节点复制到
    li
    元素中,这将产生如下结果:

    <li xlink:title="..." />
    
  • 而我怀疑您实际上想要属性中的数据

    将最后一行更改为

    <li>{doc($xml)/prefix:catalog/prefix:catalogRef/@xlink:tile/data(.)}</li>
    
  • {doc($xml)/prefix:catalog/prefix:catalogRef/@xlink:tile/data(.)}

  • 一切都应该正常。

    @tile
    @title
    @href
    ?或者,使用
    string()
    而不是
    data()
  • {string(doc($xml)/前缀:catalog/prefix:catalogf/@xlink:tile)}