如何使用XSL显示RDF节点的属性?

时间:2013-03-22 10:20:58

标签: xml xslt rdf

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

<?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:resource
<xsl:for-each select="//skos:broader">
    Broader: <xsl:value-of select="@rdf:resource" /><br />
</xsl:for-each> 

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

那么我做错了什么?

编辑:生成以下错误:

  

警告:XSLTProcessor :: transformToXml():第57行[path]中的未定义名称空间前缀

     

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

     

警告:XSLTProcessor :: transformToXml():运行时错误:文件[path]第25行第25行元素值 - 第57行[path]

     

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

3 个答案:

答案 0 :(得分:1)

可能因为你没有在XSLT中声明rdf命名空间而无法正常工作吗?当这个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>

答案 1 :(得分:0)

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

答案 2 :(得分: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不再起作用(尽管它基本上是相同的数据)。