2013-05-21 2 views
1

Я пытаюсь импортировать данные XML через XSLT в Adobe InDesign. Я хочу получить информацию в течение следующих четырех дней (не сегодня). До сих пор я только мог получить прогноз завтра, но не уверен, как вывести четыре дня. Шаблон выбирает день 2 (завтра) и период времени 2 (время суток)Выходные данные 4 дня в формате xdm xdl

У меня есть доступ к бесплатным метеоданных в этом формате: http://www.yr.no/place/Iceland/Capital_Region/Reykjavik/forecast.xml

Это шаблон:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" encoding="ISO-8859-1" indent="yes" omit-xml-declaration="no" cdata-section-elements=""/> 
    <xsl:strip-space elements="*"/> 

    <!-- 
    The position of the time[@period = '2'] element; indexing starts from 1. 
    You can pass in this parameter to the transformation if you want the 
    time[@period = '1'] element in some other position. 
    --> 
    <xsl:param name="time" select="2"/> <!-- This is the day --> 
    <xsl:param name="base" select="'file:///Volumes/Media/Geymsla/ymis_verkefni/DV2013/sky/'"/> 

    <xsl:template match="/"> 
    <yr> 
     <testtag> 
     <xsl:apply-templates select="weatherdata"/> 
     </testtag> 
    </yr> 
    </xsl:template> 

    <xsl:template match="weatherdata"> 
    <xsl:apply-templates select="location/name"/> 
    <xsl:apply-templates select="links/link[@id = 'overview']"/> 
    <base><xsl:value-of select="$base"/></base> 
    <xsl:apply-templates select="meta/lastupdate"/> 
    <!-- Apply the <time period="2"> element in $time position, the time of day --> 
    <xsl:apply-templates select="forecast/tabular/time[@period = '2'][number($time)]"/> 
    </xsl:template> 

    <xsl:template match="tabular/time"> 
    <xsl:apply-templates select="symbol"/> 
    <xsl:apply-templates select="precipitation"/> 
    <xsl:apply-templates select="temperature"/> 
    <xsl:apply-templates select="windSpeed"/> 
    <xsl:apply-templates select="windDirection"/> 

    <!-- 
    Use attribute value template (AVT) to construct the attribute value: 
    http://lenzconsulting.com/how-xslt-works/#attribute_value_templates 
    --> 
    <Image href="{concat($base, symbol/@var, '.png')}"/> 
    </xsl:template> 

    <xsl:template match="location/name"> 
    <title> 
     <xsl:value-of select="."/> 
    </title> 
    </xsl:template> 

    <xsl:template match="links/link"> 
    <alternate> 
     <!-- Use the value of the @url attribute of this element --> 
     <xsl:value-of select="@url"/> 
    </alternate> 
    </xsl:template> 

    <xsl:template match="temperature"> 
    <tempval> 
     <xsl:value-of select="@value"/> 
    </tempval> 
    </xsl:template> 

    <xsl:template match="windSpeed"> 
    <speedname> 
     <xsl:value-of select="@name"/> 
    </speedname> 

    <speedmps> 
     <xsl:value-of select="@mps"/> 
    </speedmps> 
    </xsl:template> 

    <xsl:template match="windDirection"> 
    <dirdeg> 
     <xsl:value-of select="@deg"/> 
    </dirdeg> 

    <dircode> 
     <xsl:value-of select="@code"/> 
    </dircode> 

    <dirname> 
     <xsl:value-of select="@name"/> 
    </dirname> 
    </xsl:template> 

    <xsl:template match="precipitation"> 
    <precip> 
     <xsl:value-of select="@value"/> 
    </precip> 
    </xsl:template> 

    <xsl:template match="symbol"> 
    <symbolvar> 
     <xsl:value-of select="@var"/> 
    </symbolvar> 

    <symbolnr> 
     <xsl:value-of select="@number"/> 
    </symbolnr> 

    <symbolname> 
     <xsl:value-of select="@name"/> 
    </symbolname> 
    </xsl:template> 

    <xsl:template match="lastupdate"> 
    <!-- Copy the original node as is --> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

ответ

0

Вы необходимо настроить фильтр предиката. Вы в настоящее время выбора всех time элементов кто есть @period=2, а затем вы к югу от выбора из этих соответствующих элементов второй один:

<!-- Apply the <time period="2"> element in $time position, the time of day --> 
<xsl:apply-templates select="forecast/tabular/time[@period = '2'][number($time)]"/> 

Для того, чтобы выбрать @period, заданное параметром $time вы будете использовать:

<xsl:apply-templates select="forecast/tabular/time[@period = number($time)]"/> 

Тогда вы можете FILER в течение следующих четырех дней, применяя предикат Фитлер на этом множестве:

<xsl:apply-templates select="forecast/tabular/time[@period = number($time)] 
             [position() > 1 and position() &lt;= 5]"/> 
+0

Спасибо, миллион, что сработало :) –