Преобразование XSLT из RDF в HTML - PullRequest
4 голосов
/ 15 ноября 2010

Я пытаюсь преобразовать файл RDF в HTML, используя XSLT.

Я использую шаблон, который я нашел в Интернете: 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>

Однако я не могу заставить его работать для RDF \ XMLчто я получаю с lastfm.rdfize.com/: (здесь ссылка для файла) 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?Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 15 ноября 2010

Ваша главная проблема в том, что ваша таблица стилей слишком специфична для домена. RDF / XML - это очень сложная сериализация, которая позволяет заявлять о себе несколькими способами. Ваша таблица стилей ссылается на очень конкретные имена элементов, которые действительны только в очень узком диапазоне документов RDF / XML, например

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

Вышеприведенная попытка сопоставить элементы корневого уровня <rdf:RDF>, что на самом деле не является обязательным - допустимо использование альтернативных корневых элементов или добавление <rdf:RDF> в другие элементы XML при условии, что имеется только один.

Затем он пытается сопоставить элемент <foo:item>, который является идентификатором, специфичным для документа, это имя элемента может быть абсолютно любым от общего <rdf:Description> до предыдущего примера.

Решение

Не пытайтесь преобразовать RDF / XML с помощью таблицы стилей, так как любая написанная вами таблица стилей, которая может преобразовать полный диапазон документов RDF / XML, будет настолько нелепо сложна, что не будет иметь никакого смысла.

Вместо найдите себе хорошую библиотеку RDF (для большинства основных языков есть одна или несколько), которая предоставляет анализатор RDF / XML и средство записи HTML или HTML + RDFa и использует их. Если вы хотите управлять выводом HTML в качестве основы, используйте средство записи HTML-библиотеки в качестве руководства и адаптируйте его или просто примените таблицу стилей CSS к выводу.

0 голосов
/ 23 ноября 2010

Согласитесь с Робом, что вам стоит взглянуть на хороший RDF API, но вы также можете попробовать grddl .

...