<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://periapsis.org/tellico/" xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2007-10-29" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" version="1.0"> <!-- =================================================================== Tellico XSLT file - used for importing Amazon Web Services data. Copyright (C) 2004-2007 Robby Stephenson - robby@periapsis.org This XSLT stylesheet is designed to be used with the 'Tellico' application, which can be found at http://www.periapsis.org/tellico/ =================================================================== --> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" doctype-public="-//Robby Stephenson/DTD Tellico V10.0//EN" doctype-system="http://periapsis.org/tellico/dtd/v10/tellico.dtd"/> <!-- need to figure out what type of collection --> <xsl:variable name="args" select="//aws:OperationRequest/aws:Arguments"/> <xsl:variable name="tmp"> <xsl:choose> <!-- SearchIndex is mode, unless doing ISBN or UPC search --> <xsl:when test="$args/aws:Argument[@Name='SearchIndex']"> <xsl:value-of select="$args/aws:Argument[@Name='SearchIndex']/@Value"/> </xsl:when> <!-- only happens for books --> <xsl:when test="$args/aws:Argument[@Name='Operation']/@Value='ItemLookup'"> <xsl:text>Books</xsl:text> </xsl:when> </xsl:choose> </xsl:variable> <!-- France might have DVD instead of Video --> <xsl:variable name="mode"> <xsl:choose> <xsl:when test="$tmp='DVD'"> <xsl:text>Video</xsl:text> </xsl:when> <xsl:otherwise> <xsl:value-of select="$tmp"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- for lower-casing --> <xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable> <xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> <xsl:template match="/"> <tellico syntaxVersion="10"> <collection title="Amazon Import"> <xsl:attribute name="type"> <xsl:choose> <xsl:when test="$mode='Books'"> <xsl:text>2</xsl:text> </xsl:when> <xsl:when test="$mode='Video'"> <xsl:text>3</xsl:text> </xsl:when> <!-- also can be pop-music-de --> <xsl:when test="$mode='Music'"> <xsl:text>4</xsl:text> </xsl:when> <xsl:when test="$mode='VideoGames'"> <xsl:text>11</xsl:text> </xsl:when> </xsl:choose> </xsl:attribute> <fields> <field name="_default"/> <field flags="0" title="Amazon Link" category="General" format="4" type="7" name="amazon" i18n="true"/> <!-- the amazon importer will actually download the images and ignore these fields --> <field flags="0" title="Small Image" category="Images" format="4" type="7" name="small-image"/> <field flags="0" title="Medium Image" category="Images" format="4" type="7" name="medium-image"/> <field flags="0" title="Large Image" category="Images" format="4" type="7" name="large-image"/> </fields> <xsl:for-each select="//aws:Items/aws:Item"> <xsl:apply-templates select="."/> </xsl:for-each> </collection> </tellico> </xsl:template> <xsl:template match="aws:Item"> <entry> <amazon> <xsl:value-of select="aws:DetailPageURL"/> </amazon> <small-image> <xsl:value-of select="aws:SmallImage/aws:URL"/> </small-image> <medium-image> <xsl:value-of select="aws:MediumImage/aws:URL"/> </medium-image> <large-image> <xsl:value-of select="aws:LargeImage/aws:URL"/> </large-image> <xsl:choose> <xsl:when test="$mode='Books'"> <comments> <xsl:value-of select="aws:EditorialReviews/aws:EditorialReview/aws:Content"/> </comments> <keywords i18n="true"> <xsl:for-each select="aws:BrowseNodes/aws:BrowseNode"> <keyword> <xsl:call-template name="nodes"> <xsl:with-param name="node" select="."/> </xsl:call-template> </keyword> </xsl:for-each> </keywords> </xsl:when> <xsl:when test="$mode='Music'"> <comments> <xsl:value-of select="aws:EditorialReviews/aws:EditorialReview[1]/aws:Content"/> </comments> <tracks> <!-- too hard to know which artist goes with which track, just grab first --> <xsl:variable name="artist" select="aws:ItemAttributes/aws:Artist[1]"/> <xsl:for-each select="aws:Tracks//aws:Track"> <track> <xsl:value-of select="."/> <xsl:text>::</xsl:text> <!-- too hard to know which artist goes with which track, just grab first --> <xsl:value-of select="$artist"/> </track> </xsl:for-each> </tracks> <!-- these get cleaned up within Tellico itself --> <genres i18n="true"> <xsl:for-each select="aws:BrowseNodes/aws:BrowseNode"> <genre> <xsl:call-template name="nodes"> <xsl:with-param name="node" select="."/> </xsl:call-template> </genre> </xsl:for-each> </genres> </xsl:when> <xsl:when test="$mode='Video'"> <plot> <xsl:value-of select="aws:EditorialReviews/aws:EditorialReview[1]/aws:Content"/> </plot> <!-- these get cleaned up within Tellico itself --> <genres i18n="true"> <xsl:for-each select="aws:BrowseNodes/aws:BrowseNode"> <genre> <xsl:call-template name="nodes"> <xsl:with-param name="node" select="."/> </xsl:call-template> </genre> </xsl:for-each> </genres> </xsl:when> <xsl:when test="$mode='VideoGames'"> <description> <xsl:value-of select="aws:EditorialReviews/aws:EditorialReview[1]/aws:Content"/> </description> </xsl:when> </xsl:choose> <xsl:apply-templates select="aws:ItemAttributes"/> </entry> </xsl:template> <xsl:template match="aws:ItemAttributes"> <title> <xsl:value-of select="aws:Title"/> </title> <languages> <xsl:for-each select="aws:Languages/aws:Language[not(aws:Name=preceding-sibling::aws:Language/aws:Name)]"> <language> <xsl:value-of select="aws:Name"/> </language> </xsl:for-each> </languages> <xsl:choose> <!-- book collection stuff --> <xsl:when test="$mode='Books'"> <authors> <xsl:for-each select="aws:Author"> <author> <xsl:value-of select="."/> </author> </xsl:for-each> </authors> <isbn> <!-- the EAN is the isbn-13 value for books --> <xsl:choose> <xsl:when test="aws:ISBN"> <xsl:value-of select="aws:ISBN"/> </xsl:when> <xsl:when test="aws:EAN"> <xsl:value-of select="aws:EAN"/> </xsl:when> </xsl:choose> </isbn> <publisher> <xsl:value-of select="aws:Publisher"/> </publisher> <editors> <xsl:for-each select="aws:Creator[@Role='Editor']"> <editor> <xsl:value-of select="."/> </editor> </xsl:for-each> </editors> <binding i18n="true"> <xsl:choose> <xsl:when test="aws:Binding='Hardcover'"> <xsl:text>Hardback</xsl:text> </xsl:when> <xsl:when test="contains(aws:Binding, 'Paperback')"> <xsl:text>Paperback</xsl:text> </xsl:when> <!-- specifically for France --> <xsl:when test="aws:Binding='Broché' or aws:Binding='Poche'"> <xsl:text>Souple</xsl:text> </xsl:when> <xsl:otherwise> <xsl:value-of select="aws:Binding"/> </xsl:otherwise> </xsl:choose> </binding> <pub_year> <xsl:call-template name="year"> <xsl:with-param name="value" select="aws:PublicationDate"/> </xsl:call-template> </pub_year> <edition> <xsl:value-of select="aws:Edition"/> </edition> <pages> <xsl:value-of select="aws:NumberOfPages"/> </pages> </xsl:when> <!-- music collection stuff --> <xsl:when test="$mode='Music'"> <artists> <xsl:for-each select="aws:Artist"> <artist> <xsl:value-of select="."/> </artist> </xsl:for-each> <!-- only add composers if no artist --> <xsl:if test="not(aws:Artist)"> <xsl:for-each select="aws:Creator[@Role='Composer']"> <artist> <xsl:value-of select="."/> </artist> </xsl:for-each> </xsl:if> </artists> <year> <xsl:call-template name="year"> <xsl:with-param name="value" select="aws:ReleaseDate"/> </xsl:call-template> </year> <labels> <label> <xsl:value-of select="aws:Label"/> </label> </labels> <medium i18n="true"> <xsl:variable name="medium" select="aws:Binding"/> <xsl:choose> <xsl:when test="$medium='Audio CD'"> <xsl:text>Compact Disc</xsl:text> </xsl:when> <xsl:otherwise> <xsl:comment> <xsl:value-of select="$medium"/> </xsl:comment> </xsl:otherwise> </xsl:choose> </medium> </xsl:when> <!-- video collection stuff --> <xsl:when test="$mode='Video'"> <directors> <xsl:for-each select="aws:Director"> <director> <xsl:value-of select="."/> </director> </xsl:for-each> </directors> <casts> <!-- special case for french, there might be more actors than aws:Actor elements --> <xsl:for-each select="aws:Creator[@Role='Acteur']"> <!-- cast is a 2-column table --> <cast> <column> <xsl:value-of select="."/> </column> </cast> </xsl:for-each> <!-- assume only add actor if no creators --> <xsl:if test="not(aws:Creator[@Role='Acteur'])"> <xsl:for-each select="aws:Actor"> <!-- cast is a 2-column table --> <cast> <column> <xsl:value-of select="."/> </column> </cast> </xsl:for-each> </xsl:if> </casts> <year> <xsl:call-template name="year"> <xsl:with-param name="value" select="aws:TheatricalReleaseDate"/> </xsl:call-template> </year> <medium i18n="true"> <xsl:variable name="medium" select="aws:ProductGroup"/> <xsl:choose> <xsl:when test="$medium='Video'"> <xsl:text>VHS</xsl:text> </xsl:when> <xsl:when test="contains(translate($medium,$lcletters,$ucletters),'blu-ray')"> <xsl:text>Blu-ray</xsl:text> </xsl:when> <xsl:otherwise> <xsl:value-of select="$medium"/> </xsl:otherwise> </xsl:choose> </medium> <color i18n="true"> <xsl:choose> <xsl:when test="aws:Format[.='Black & White']"> <xsl:text>Black & White</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>Color</xsl:text> </xsl:otherwise> </xsl:choose> </color> <aspect-ratios> <xsl:for-each select="aws:AspectRatio"> <aspect-ratio> <xsl:value-of select="."/> </aspect-ratio> </xsl:for-each> </aspect-ratios> <xsl:if test="aws:Format[.='Widescreen']"> <widescreen> <xsl:text>true</xsl:text> </widescreen> </xsl:if> <languages> <xsl:for-each select="aws:Languages/aws:Language[not(aws:Name=preceding-sibling::aws:Language/aws:Name)]"> <language> <xsl:value-of select="aws:Name"/> </language> </xsl:for-each> </languages> <audio-tracks> <xsl:choose> <xsl:when test="aws:Languages/aws:Language/aws:AudioFormat[starts-with(.,'Dolby')]"> <audio-track> <xsl:value-of select="aws:Languages/aws:Language/aws:AudioFormat[starts-with(.,'Dolby')][1]"/> </audio-track> </xsl:when> <xsl:when test="aws:Format[starts-with(.,'Dolby')]"> <audio-track> <xsl:value-of select="aws:Format[starts-with(.,'Dolby')][1]"/> </audio-track> </xsl:when> </xsl:choose> <xsl:if test="aws:Languages/aws:Language/aws:AudioFormat[starts-with(.,'DTS')]"> <audio-track> <xsl:value-of select="aws:Languages/aws:Language/aws:AudioFormat[starts-with(.,'DTS')][1]"/> </audio-track> </xsl:if> </audio-tracks> <certification i18n="true"> <xsl:variable name="mpaa" select="aws:AudienceRating"/> <xsl:choose> <xsl:when test="starts-with($mpaa, 'PG-13')"> <xsl:text>PG-13 (USA)</xsl:text> </xsl:when> <xsl:when test="starts-with($mpaa, 'PG')"> <xsl:text>PG (USA)</xsl:text> </xsl:when> <xsl:when test="starts-with($mpaa, 'R')"> <xsl:text>R (USA)</xsl:text> </xsl:when> <xsl:when test="starts-with($mpaa, 'G')"> <xsl:text>G (USA)</xsl:text> </xsl:when> <xsl:otherwise> <xsl:comment> <xsl:value-of select="$mpaa"/> </xsl:comment> </xsl:otherwise> </xsl:choose> </certification> <studios> <studio> <xsl:value-of select="aws:Studio"/> </studio> </studios> <xsl:if test="aws:RegionCode"> <region i18n="true"> <xsl:value-of select="concat('Region ', aws:RegionCode)"/> </region> </xsl:if> <xsl:if test="aws:RunningTime[@Units='minutes']"> <running-time> <xsl:value-of select="aws:RunningTime[@Units='minutes']"/> </running-time> </xsl:if> </xsl:when> <!-- video game collection stuff --> <xsl:when test="$mode='VideoGames'"> <publisher> <xsl:value-of select="aws:Publisher"/> </publisher> <!-- assume year is last four characters of ReleaseDate --> <year> <xsl:call-template name="year"> <xsl:with-param name="value" select="aws:ReleaseDate"/> </xsl:call-template> </year> <!-- assume that the only time there are multiple platforms is when it's for multiple versions of windows --> <platform i18n="true"> <xsl:call-template name="platform"> <xsl:with-param name="value" select="aws:Platform"/> </xsl:call-template> </platform> <genres i18n="true"> <xsl:for-each select="aws:Feature[starts-with(., 'Genre:')]"> <genre> <xsl:value-of select="substring(., 7)"/> <!-- ends with a space --> </genre> </xsl:for-each> </genres> <certification i18n="true"> <xsl:choose> <xsl:when test="aws:ESRBAgeRating = 'Rating Pending'"> <xsl:text>Pending</xsl:text> </xsl:when> <xsl:otherwise> <xsl:value-of select="aws:ESRBAgeRating"/> </xsl:otherwise> </xsl:choose> </certification> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="nodes"> <xsl:param name="node"/> <xsl:variable name="firstNode" select="$node/aws:Name"/> <xsl:variable name="tailNodes"> <xsl:choose> <xsl:when test="$node/aws:Ancestors/aws:BrowseNode[1]/aws:Name"> <xsl:call-template name="nodes"> <xsl:with-param name="node" select="$node/aws:Ancestors/aws:BrowseNode[1]"/> </xsl:call-template> </xsl:when> </xsl:choose> </xsl:variable> <xsl:choose> <xsl:when test="string-length($firstNode)"> <xsl:choose> <xsl:when test="string-length($tailNodes)"> <xsl:value-of select="concat($tailNodes, '/', $firstNode)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$firstNode"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:when test="string-length($tailNodes)"> <xsl:value-of select="$tailNodes"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="year"> <xsl:param name="value"/> <xsl:variable name="numbers"> <xsl:value-of select="translate($value, translate($value, '0123456789', ''), '')"/> </xsl:variable> <!-- assume that Amazon always encodes the date with the 4-digit year first --> <xsl:value-of select="substring($numbers, 0, 5)"/> </xsl:template> <xsl:template name="platform"> <xsl:param name="value"/> <xsl:variable name="lcvalue"> <xsl:value-of select="translate($value, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"/> </xsl:variable> <xsl:choose> <xsl:when test="contains($lcvalue, '360')"> <xsl:text>Xbox 360</xsl:text> </xsl:when> <xsl:when test="starts-with($lcvalue, 'x')"> <xsl:text>Xbox</xsl:text> <!-- as defined in the default field --> </xsl:when> <xsl:when test="contains($lcvalue, 'wii')"> <xsl:text>Nintendo Wii</xsl:text> <!-- as defined in the default field --> </xsl:when> <xsl:when test="$lcvalue = 'sony psp'"> <xsl:text>PSP</xsl:text> <!-- as defined in the default field --> </xsl:when> <xsl:when test="starts-with($lcvalue, 'windows')"> <xsl:text>Windows</xsl:text> <!-- as defined in the default field --> </xsl:when> <xsl:when test="starts-with($lcvalue, 'mac')"> <xsl:text>Mac OS</xsl:text> <!-- as defined in the default field --> </xsl:when> <xsl:when test="$lcvalue = 'sega dreamcast'"> <xsl:text>Dreamcast</xsl:text> <!-- as defined in the default field --> </xsl:when> <xsl:when test="starts-with($lcvalue, 'playstation')"> <xsl:choose> <xsl:when test="contains($lcvalue, '3')"> <xsl:text>PlayStation3</xsl:text> </xsl:when> <xsl:when test="contains($lcvalue, '2')"> <xsl:text>PlayStation2</xsl:text> </xsl:when> <xsl:otherwise> <xsl:value-of select="$value"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="$value"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>