XIP mit XSLT: Unterschied zwischen den Versionen

Aus SiteparkWiki
Zur Navigation springen Zur Suche springen
Zeile 3: Zeile 3:
 
Nachfolgend werden ein paar Beispiele vorgestellt, um die Möglichkeiten des XIP-Imports mit Hilfe von XSLT zu verdeutlichen.
 
Nachfolgend werden ein paar Beispiele vorgestellt, um die Möglichkeiten des XIP-Imports mit Hilfe von XSLT zu verdeutlichen.
  
==Artikel aus einem RSS-Feed imporieren==
+
[[XIP aus RSS-Feed]] - RSS-Feeds in XIP umwandeln
  
Mit folgendem Beispiel lässt sich ein RSS-Feed (Version 2.0) importieren. Die einzelnen Einträge werden als Resource-Artikel angelegt. Der Anchor der Resource-Artikel ergibt sich aus der Position innerhalb des RSS-Feed.
 
 
<source lang="xml">
 
<?xml version="1.0" encoding="UTF-8"?>
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
 
 
    <xsl:template match="/">
 
        <xip>
 
            <xsl:for-each select="/rss/channel/item">
 
                <resource parent="rss.channel.x" name="{title}" anchor="rss.channel.x.item.{position()}">
 
                    <text name="description"><xsl:value-of select="description"/></text>
 
                    <url name="link"><xsl:value-of select="link"/></url>
 
                    <binary name="enclosure" url="{enclosure/@url}"/>
 
                </resource>
 
            </xsl:for-each>
 
        </xip>
 
    </xsl:template>
 
 
</xsl:stylesheet>
 
</source>
 
 
Beim obigen Beispiel hat die Verwendung der Position des Items innerhalb des RSS-Feed als Anchor zur Folge, das ein bestimmter Resource-Artikel bei Änderung des RSS-Feeds immer andere Daten enthält. Dies ist nicht immer gewünscht. Um dieses Problem zu lösen muss ein Eindeutige Anchor vergeben werden. Im RSS-Feed gibt es das Element <guid>, mit dem der Eintrag eindeutig identifiziert werden kann. Oftmals ist dieser Wert eine URL. Der Wert kann nicht direkt als Anchor verwendet werden, da in einer URL Zeichen enthalten sind, die in einem Anchor nicht enthalten sein dürfen.
 
 
Im folgenden Beispiel wird dieses Problem gelöst, indem ein Hash-Wert des <guid>-Elementes erzeugt wird.
 
 
<source lang="xml">
 
<?xml version="1.0" encoding="UTF-8"?>
 
 
<xsl:stylesheet version="1.0"
 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
 
        xmlns:xip="http://ies.sitepark.com/xip"
 
            extension-element-prefixes="xip">
 
 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
 
 
    <!--
 
    int xip:hashCode(String s)
 
    Erzeugt aus einer Zeichenkette einen Hash-Code
 
    -->
 
    <xsl:function name="xip:hashCode">
 
        <xsl:param name="s"/>
 
        <xsl:value-of select="xs:decimal(xs:double(xip:hashCode($s, 1, 0)))"/>
 
    </xsl:function>
 
    <xsl:function name="xip:hashCode">
 
        <xsl:param name="s"/>
 
        <xsl:param name="i"/>
 
        <xsl:param name="h"/>
 
        <xsl:variable name="code" select="string-to-codepoints(substring($s, $i, 1))"/>
 
        <xsl:variable name="len" select="string-length($s)"/>
 
        <xsl:choose>
 
            <xsl:when test="($i + 1) &lt;= $len">
 
                <xsl:value-of select="xip:hashCode($s, $i+1, $h*31 + $code)"/>
 
            </xsl:when>
 
            <xsl:otherwise>
 
                <xsl:value-of select="$h*31 + $code"/>
 
            </xsl:otherwise>
 
        </xsl:choose>
 
    </xsl:function>
 
 
 
    <xsl:template match="/">
 
        <xip>
 
            <xsl:for-each select="/rss/channel/item">
 
                <resource parent="rss.channel.spiegel" name="{title}" code="{string-to-codepoints(guid)}" anchor="rss.channel.spiegel.item.{xip:hashCode(guid)}">
 
                    <text name="description"><xsl:value-of select="description"/></text>
 
                    <url name="link"><xsl:value-of select="link"/></url>
 
                    <binary name="enclosure" url="{enclosure/@url}"/>
 
                </resource>
 
            </xsl:for-each>
 
        </xip>
 
    </xsl:template>
 
 
</xsl:stylesheet>
 
</source>
 
  
 
<noinclude>
 
<noinclude>
 
[[Category:XIP]]
 
[[Category:XIP]]
 
</noinclude>
 
</noinclude>

Version vom 30. November 2009, 14:49 Uhr

XSLT ist eine sehr gute Möglichkeit beliebiger XML-Daten in das XIP Format umzuwandeln. Über diesen Weg lassen sich relativ schnell auch komplexere Strukturen in den IES importieren.

Nachfolgend werden ein paar Beispiele vorgestellt, um die Möglichkeiten des XIP-Imports mit Hilfe von XSLT zu verdeutlichen.

XIP aus RSS-Feed - RSS-Feeds in XIP umwandeln