从RDF到HTML的XSLT转换

4
我试图使用XSLT将一个RDF文件转换成HTML。
我使用了我在网上找到的模板: http://snippets.dzone.com/posts/show/1164
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:foo="http://purl.org/rss/1.0/">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <xsl:apply-templates select="/rdf:RDF/foo:channel"/>
    </xsl:template>
    <xsl:template match="/rdf:RDF/foo:channel">
        <h3><xsl:value-of select="foo:title"/></h3>
        <p><xsl:value-of select="foo:description"/></p>
        <ul>
            <xsl:apply-templates select="/rdf:RDF/foo:item"/>
        </ul>
    </xsl:template>
    <xsl:template match="/rdf:RDF/foo:item">
        <li>
            <a href="{foo:link}" title="{substring(dc:date, 0, 11)}"><xsl:value-of select="foo:title"/></a>
            <p><xsl:value-of select="foo:description" disable-output-escaping="yes" /></p>
        </li>
    </xsl:template>
</xsl:stylesheet>

它可以完美地处理像这样的RDF文件: (这是完整文件的链接http://dl.dropbox.com/u/2232733/rdfexample.xml

<?xml version="1.0" encoding="utf-8"?><!-- generator="wordpress/1.2" -->
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
>
<channel rdf:about="http://www.wasab.dk/morten/blog/rdf">
    <title>Binary Relations</title>
    <link>http://www.wasab.dk/morten/blog</link>
    <description>Reflections on the web</description>
    <dc:language>en</dc:language>
    <dc:date>2004-05-29T23:02:37Z</dc:date>
    <admin:generatorAgent rdf:resource="http://wordpress.org/?v=1.2"/>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
    <items>
<rdf:Seq>
<rdf:li rdf:resource="http://www.wasab.dk/morten/blog/archives/2004/05/30/wordpress-plugin-linkifier"/>
...
<rdf:li rdf:resource="http://www.wasab.dk/morten/blog/archives/2004/05/20/yet-another-semweb-blogger"/>
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://www.wasab.dk/morten/blog/archives/2004/05/30/wordpress-plugin-linkifier">
    <title>WordPress Plugin: Linkifier</title>

然而,我无法将其用于从lastfm.rdfize.com获得的RDF\XML文件: (文件的链接在这里) http://dl.dropbox.com/u/2232733/metallica_rdf_xml.xml 它具有不同的结构,我无法弄清楚在XSTL中应该使用哪些标签来将其转换为HTML:
rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:terms="http://purl.org/dc/terms/"
  xmlns:foaf="http://xmlns.com/foaf/0.1/"
  xmlns:owl="http://www.w3.org/2002/07/owl#"
  xmlns:mo="http://purl.org/ontology/mo/"
  xmlns:ov="http://open.vocab.org/terms/"
  xmlns:event="http://purl.org/NET/c4dm/event.owl#"
  xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
  xmlns:v="http://www.w3.org/2006/vcard/ns#">

  <rdf:Description rdf:about="http://lastfm.rdfize.com/artists/Metallica">
    <rdf:type rdf:resource="http://purl.org/ontology/mo/MusicArtist"/>
    <rdfs:label>Metallica</rdfs:label>
  ...

所以我的问题是 - 我应该如何形成一个XSLT来处理我的RDF? 提前感谢!

  1. 两个文本都严重畸形 - 不完整的XML文档。
  2. 没有任何问题被提出。请纠正。
- Dimitre Novatchev
我已经提供了上面的链接- http://dl.dropbox.com/u/2232733/rdfexample.xml http://dl.dropbox.com/u/2232733/metallica_rdf_xml.xml问题是-如何正确处理我的rdf? - Dmitry
也许如果您提供所需的输出,有人会发布一个样式表示例来匹配您的输入样本。 - user357812
2个回答

4

您的主要问题是样式表过于特定于域。 RDF/XML 是一种非常复杂的序列化方式,允许多种陈述方式。 您的样式表引用了非常特定的元素名称,这些名称仅在极窄范围的 RDF/XML 文档中有效,例如:

<xsl:template match="/rdf:RDF/foo:item">

上述尝试匹配根级别的<rdf:RDF>元素,但实际上这并不是强制性的 - 可以使用替代根元素或将<rdf:RDF>嵌入到其他XML元素中,只要有一个即可。
然后它尝试匹配<foo:item>元素,这是一个特定于文档的ID,该元素名称可以是任何东西,从通用的<rdf:Description>到前面的示例。 解决方案 不要尝试使用样式表转换RDF/XML,因为你编写的任何一个可以转换全范围的RDF/XML文档的样式表都会非常复杂,毫无意义。 相反,找一个好的RDF库(大多数主要语言都有一个或多个)提供RDF/XML解析器和HTML或HTML+RDFa编写器,并使用它们。如果想要控制HTML输出,请使用库的HTML编写器作为指南并进行调整,或者只需在其输出上应用CSS样式表即可。

谢谢! 你能指向一个有HTML写入器的吗? 我目前正在使用Jena,但Jena只允许导出到XML和TURTLE。 - Dmitry
关于“不要使用通用样式表”的建议,您是正确的。RDF 是一种尝试创建标准“关系”词汇以及标准“语义”词汇的方法。但是,只要您知道如何处理这两个领域,就可以使用通用样式表。 - user357812
@Hippopotamus,Jena有可用的RDFa编写器,但它们不是标准的Jena发行版的一部分。 - RobV
我怀疑是否有通用的HTML编写器,因为没有标准的方法将随机RDF表示为HTML。相反,最好将整个RDF文件读入应用程序(使用Jena或librdf.org(如果您想使用C)),并以自己的自定义方式编写为HTML。 - Norman Gray
不过,有一种叫做RDFa的技术可以将RDF嵌入到HTML中,因此您可以使用现有的RDFa编写器提供一个框架,然后根据您的需求自定义输出HTML的格式,或者将其作为在HTML中嵌入RDFa的指南。 - RobV

-1

同意Rob的看法,你应该研究一下好的RDF API,但你也可以考虑一下grddl


GRDDL试图解决相反的问题:将XML转换为RDF,并使用XSLT进行转换。它无法用于将RDF/XML转换为其他XML格式。 - Richard Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接