1

我需要rdf:resource从下面的 XML/RDF 中显示值。

<?xml version="1.0" encoding="UTF-8"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#">
    <skos:Concept rdf:about="http://example.com/randomurl">

        <skos:prefLabel xml:lang="en">example</skos:prefLabel>
        <skos:broader rdf:resource="http://example.com/randomurl"/>
        <skos:broader rdf:resource="http://example.com/randomurl"/>
        <owl:sameAs rdf:resource="http://example.com/randomurl"/>

    </skos:Concept>
</rdf:RDF>

我试过了,但找不到正确的路径。这可能是我忽略的非常小的和值得关注的东西。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:skos="http://www.w3.org/2004/02/skos/core#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:owl="http://www.w3.org/2002/07/owl#">

<xsl:template match="/">
    <html>
    <body>    
    <h2><xsl:value-of select="//skos:prefLabel" /></h2>
    <br />    
    <xsl:for-each select="//skos:broader">
        Broader: <br />
    </xsl:for-each>        
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

它确实进入了 for-each 循环并显示了正确数量的节点skos:narrower,但是当我尝试获取rdf:resourcewith

<xsl:for-each select="//skos:broader">
    Broader: <xsl:value-of select="@rdf:resource" /><br />
</xsl:for-each> 

或选择的变体,它只是不起作用。我试图通过谷歌搜索和在 Stack Overflow 上搜索来找到解决方案,但没有找到解决方案。

那么我做错了什么?

编辑:产生以下错误:

警告:XSLTProcessor::transformToXml(): Undefined namespace prefix in [path] on line 57

警告:XSLTProcessor::transformToXml(): xmlXPathCompiledEval: 第 57 行 [path] 中的评估失败

警告:XSLTProcessor::transformToXml(): runtime error: file [path] line 25 element value-of in [path] on line 57

警告:XSLTProcessor::transformToXml():XPath 评估未返回任何结果。在

4

3 回答 3

1

会不会是因为您没有rdf在 XSLT 中声明命名空间而导致它不起作用?当这个 XSLT:

<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:skos="http://www.w3.org/2004/02/skos/core#"
      xmlns:dc="http://purl.org/dc/elements/1.1/"
      xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
      xmlns:owl="http://www.w3.org/2002/07/owl#"
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <xsl:template match="/">
    <html>
      <body>
        <h2>
          <xsl:value-of select="//skos:prefLabel" />
        </h2>
        <br />
        <xsl:for-each select="//skos:broader">
          <xsl:text>Broader: </xsl:text>
          <xsl:value-of select="@rdf:resource"/>
          <br />
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

在您的示例输入上运行,结果是:

<html xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <body>
    <h2>example</h2><br>
    Broader: http://example.com/randomurl<br>
    Broader: http://example.com/randomurl<br>
  </body>
</html>
于 2013-03-22T10:50:31.537 回答
0

在您的 XSLT 中,您忘记了导入 RDF 名称空间。只需添加xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"到您的 XSLT。它应该可以正常工作。

于 2013-03-22T11:12:46.593 回答
0

只是备注:处理 RDF/XML 时,一般规则是“不要使用 XML 工具!” 您是否有理由必须使用 XSLT 而不是专用的 RDF 工具?您能否确定与 XSLT 一起使用的 RDF 文档将始终具有相同的结构?

让我们想象一下,我使用 RDF API 解析您的 RDF/XML 文档。然后我将它重新序列化为 RDF/XML。结果很可能是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:skos="http://www.w3.org/2004/02/skos/core#"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
         xmlns:owl="http://www.w3.org/2002/07/owl#">
<skos:Concept rdf:about="http://example.com/randomurl">

    <skos:prefLabel xml:lang="en">example</skos:prefLabel>
    <skos:broader>
        <rdf:Description rdf:about="http://example.com/randomurl"/>
    </skos:broader>
    <skos:broader>
        <rdf:Description rdf:about="http://example.com/randomurl"/>
    </skos:broader>
    <owl:sameAs>
        <rdf:Description rdf:about="http://example.com/randomurl"/>
    </owl:sameAs>

</skos:Concept>
</rdf:RDF>

并且您的 XSLT 不再起作用(尽管基本上是相同的数据)。

于 2013-03-23T07:51:05.867 回答