我需要在下面的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评估未返回任何结果。在
答案 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不再起作用(尽管它基本上是相同的数据)。