You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

示例输出

Example output

解决方法

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:23:23