XSLTForms/XForms实例数据命名空间问题:无法无通配符定位SPARQL结果
XForms 中 SPARQL 查询结果的命名空间定位问题
我在使用XForms时遇到问题:数据源是SPARQL查询结果,目前只能通过以下XPATH表达式获取数据:
<bind id="bnd_results" nodeset="instance('sparql')/*/*/*"/>
但无法在不使用*通配符的情况下精确定位数据,推测问题与实例数据的命名空间有关。
代码实现
<?php header('Content-Type: text/xml; charset=utf-8'); if (isset($_GET['debug'])) { $debug="yes"; } else { $debug="no"; } ?> <?xml-stylesheet href="xsltforms/xsltforms.xsl" type="text/xsl"?> <?xsltforms-options debug="<?=$debug?>"?> <?php $sparqlep="https://dbpedia.org/sparql?query="; $sparql=<<<SPARQL SELECT DISTINCT(?linkedPerson) WHERE { ?s rdfs:label 'World Wide Web Consortium'@en; foaf:isPrimaryTopicOf ?wikipage. ?linkedPerson rdf:type dbo:Person, foaf:Person; foaf:isPrimaryTopicOf ?linkedwikipage. { ?s ^dbo:wikiPageWikiLink ?linkedPerson.} UNION { ?s dbo:wikiPageWikiLink ?linkedPerson. }} LIMIT 100 SPARQL; $url=$sparqlep . rawurlencode($sparql); ?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:sparql="http://www.w3.org/2005/sparql-results#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/sw/DataAccess/rf1/result2.xsd"> <head> <model xmlns="http://www.w3.org/2002/xforms"> <instance id="sparql" src="<?=$url?>"/> <instance id="default"> <data xmlns=""> <selected/> </data> </instance> <bind id="bnd_results" nodeset="instance('sparql')/*/*/*"/> <bind id="bnd_sel" nodeset="instance('default')/selected"/> </model> </head> <body> <details> <summary>SPARQL query</summary> <code> <?=$sparql?> </code> </details> <group xmlns="http://www.w3.org/2002/xforms"> <label>Selected:</label> <output bind="bnd_sel"/> <select1 appearance="full" bind="bnd_sel"> <itemset bind="bnd_results"> <label ref="."/> <value ref="."/> </itemset> </select1> </group> </body> </html>
示例输出

解决方法
SPARQL查询结果默认使用http://www.w3.org/2005/sparql-results#命名空间,你的代码中已经声明了sparql前缀对应该命名空间,直接用带前缀的XPATH表达式即可精确定位:
将原bind节点修改为:
<bind id="bnd_results" nodeset="instance('sparql')/sparql:results/sparql:result/sparql:binding/sparql:value"/>
如果只需提取value节点,也可简化为:
<bind id="bnd_results" nodeset="instance('sparql')//sparql:value"/>
SPARQL XML结果的固定结构为:sparql:results包含多个sparql:result,每个result下是sparql:binding,其中的sparql:value就是查询结果值。使用命名空间前缀替代通配符,即可避免模糊匹配,实现精准数据定位。
内容的提问来源于stack exchange,提问作者monojohnny
相关产品推荐
相关产品推荐

