【问题标题】:How to display the attribute of an RDF node using XSL?如何使用 XSL 显示 RDF 节点的属性?
【发布时间】:2013-03-22 10:20:58
【问题描述】:

我需要从下面的 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 行元素值在第 57 行 [path] 中

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

【问题讨论】:

  • 你真的是指skos:broader吗?您的示例 XML 中没有任何这些元素。
  • 啊该死的。我以为我已经改变了这一点。杰普,我的意思是那个。
  • “它只是不起作用”......以什么方式?
  • 它在 w3schools.com 上不显示任何内容 试试看。它确实在我的服务器上显示错误,现在将它们放在帖子中。
  • 很高兴您已将其修复,但请记住,XML 中同一 RDF 图有许多不同的等效序列化(例如 &lt;skos:Concept rdf:about="http://example.com/randomurl"&gt;&lt;rdf:Description rdf:about="http://example.com/randomurl"&gt;&lt;rdf:type rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"&gt;&lt;/rdf:Description&gt;),因此您可能明智使用适当的 RDF API 而不是简单地将其视为 XML。

标签: xml xslt rdf


【解决方案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>

【讨论】:

  • 谢谢!我确实说过这可能是一件小事。我现在很认真地打脸。您只花了几分钟就弄清楚了我几个小时以来一直在尝试解决的问题。 /拥抱
  • 我现在只是想知道我怎么会错过这个......我肯定不会再犯错误了。
  • :) 很高兴为您提供帮助。听起来 w3schools 实用程序可能是在 XSLT 无效时静默失败的工具之一,因此如果遇到问题,请记住在更可靠的 XSLT 处理器上尝试它。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答! JLRishe 确实在你之前回答了,所以我选择了他的回答。
【解决方案3】:

请注意:处理 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 不再工作(尽管基本上是相同的数据)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多