2

我正在尝试通过 XSLT 将 XML 数据导入 Adob​​e InDesign。InDesign 似乎无法使用属性,即使它可以看到属性。

我可以访问这种格式的免费天气数据:http ://www.yr.no/sted/Norge/Oslo/Oslo/Oslo/varsel.xml

我不确定我使用 XSLT 将属性转换为常规 XML 格式的方法是否最好,但它确实有效。

我遇到的问题是我需要明天的天气数据,但我只得到今天的数据。数据存储在 weatherdata/forecast/tabular/time 中。

<xsl:param name="speedmps" select="weatherdata/forecast/tabular/time[@period='2']/windSpeed/@mps" />用来选择数据,但这只会选择第一个匹配项。第一场比赛是今天的天气(从12:00到18:00),我想要的是第二场比赛(第二个时段='2'比赛,即明天12:00到18:00)。一天以 4 个时段呈现,XML 文件获取了几天的预报。理想情况下,我想为今天的天气制作一个 XSLT,为明天的天气制作一个等等。

我的代码主要是剪切和粘贴,然后我尝试对其进行编辑以执行我想要的操作。我尝试制作一个 if 块,但我找不到任何可以构建的示例。目前我在 XSLT 方面的技能太基础了,而且我的期限很短。我在源数据中发现的是,时间段会根据您获取数据的时间而变化。所以我不能说它应该选择第 6 个区块,因为明天 period='2' 可能是一天中这个时候的第 5 个。(期间='0' 是 00:00 到 09:00,因此期间 0 在 09:00 之后被删除,依此类推)。

现在的第一场比赛是:

<time from="2013-02-27T12:00:00" to="2013-02-27T18:00:00" period="2">
    <!-- Valid from 2013-02-27T12:00:00 to 2013-02-27T18:00:00 -->
    <symbol number="1" name="Klarvær" var="01d" />
    <precipitation value="0" />
    <!-- Valid at 2013-02-27T12:00:00 -->
    <windDirection deg="187.2" code="S" name="Sør" />
    <windSpeed mps="1.5" name="Flau vind" />
    <temperature unit="celsius" value="-1" />
    <pressure unit="hPa" value="1030.2" />
  </time>    

现在的第二场比赛是:

<time from="2013-02-28T12:00:00" to="2013-02-28T18:00:00" period="2">
    <!-- Valid from 2013-02-28T12:00:00 to 2013-02-28T18:00:00 -->
    <symbol number="1" name="Klarvær" var="01d" />
    <precipitation value="0" />
    <!-- Valid at 2013-02-28T12:00:00 -->
    <windDirection deg="181.3" code="S" name="Sør" />
    <windSpeed mps="3.1" name="Svak vind" />
    <temperature unit="celsius" value="2" />
    <pressure unit="hPa" value="1015.7" />
  </time>

对不起,英语不是我的母语,我尽量解释清楚。

这是我的 XSLT 代码:

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

<!-- params -->
<xsl:param name="location" select="weatherdata/location/name"/>
<xsl:param name="alternate" select="weatherdata/links/link[@id='overview']/@url"/>
<xsl:param name="base" select="'file:///d:/temp/yr/sky/'"/>
<!-- We use the text forecast dates or? -->
<xsl:param name="lastupdate" select="weatherdata/meta/lastupdate" />
<xsl:param name="symbolnumber" select="weatherdata/forecast/tabular/time[@period='2']/symbol/@number" />
<xsl:param name="symbolname" select="weatherdata/forecast/tabular/time[@period='2']/symbol/@name" />
<xsl:param name="symbolvar" select="weatherdata/forecast/tabular/time[@period='2']/symbol/@var" />
<xsl:param name="precip" select="weatherdata/forecast/tabular/time[@period='2']/precipitation/@value" />
<xsl:param name="directiondeg" select="weatherdata/forecast/tabular/time[@period='2']/windDirection/@deg" />
<xsl:param name="directioncode" select="weatherdata/forecast/tabular/time[@period='2']/windDirection/@code" />
<xsl:param name="directionname" select="weatherdata/forecast/tabular/time[@period='2']/windDirection/@name" />
<xsl:param name="speedmps" select="weatherdata/forecast/tabular/time[@period='2']/windSpeed/@mps" />
<xsl:param name="speedname" select="weatherdata/forecast/tabular/time[@period='2']/windSpeed/@name" />
<xsl:param name="tempvalue" select="weatherdata/forecast/tabular/time[@period='2']/temperature/@value" />

<xsl:template match="/">
<yr>
<testtag>   
    <title><xsl:value-of select="$location"/></title>
    <alternate><xsl:value-of select="$alternate"/></alternate>
    <base><xsl:value-of select="$base"/></base>
    <lastupdate><xsl:value-of select="$lastupdate"/></lastupdate>
    <symbolvar><xsl:value-of select="$symbolvar"/></symbolvar>
    <symbolnr><xsl:value-of select="$symbolnumber"/></symbolnr>
    <symbolname><xsl:value-of select="$symbolname"/></symbolname>
    <precip><xsl:value-of select="$precip"/></precip>
    <tempval><xsl:value-of select="$tempvalue"/></tempval>
    <speedname><xsl:value-of select="$speedname"/></speedname>
    <speedmps><xsl:value-of select="$speedmps"/></speedmps>
    <dirdeg><xsl:value-of select="$directiondeg"/></dirdeg>
    <dircode><xsl:value-of select="$directioncode"/></dircode>
    <dirname><xsl:value-of select="$directionname"/></dirname>
    <Image><xsl:attribute name="href"><xsl:value-of select="$base"/><xsl:value-of select="$symbolvar"/>.png</xsl:attribute></Image>
</testtag>  
</yr>
</xsl:template> 

</xsl:stylesheet>
4

1 回答 1

0

如果你想要第二个time[@period = '2']元素(换句话说,如果我理解正确的话),你可以使用time[@period='2'][2].

然而,您的样式表并不是您真正使用 XSLT 的方式。与将节点值存储在<xsl:param>元素中然后稍后处理它们不同,约定是——显然我在这里简化了很多——为<xsl:template>要处理的输入文档中的每个节点都有一个元素。

有很多方法可以实现您想要的,但您可以使用下面的样式表作为您的代码的起点。

输入

第二<time>@period属性值为2

<time from="2013-02-28T12:00:00" to="2013-02-28T18:00:00" period="2">
    <!-- Valid from 2013-02-28T12:00:00 to 2013-02-28T18:00:00 -->
    <symbol number="1" name="Klarvær" var="01d" />
    <precipitation value="0" />
    <!-- Valid at 2013-02-28T12:00:00 -->
    <windDirection deg="181.3" code="S" name="Sør" />
    <windSpeed mps="3.1" name="Svak vind" />
    <temperature unit="celsius" value="2" />
    <pressure unit="hPa" value="1015.7" />
</time>

样式表

<?xml version="1.0" encoding="ISO-8859-1"?>
<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 = '2'] element in some other position.
  -->
  <xsl:param name="time" select="2"/>
  <xsl:param name="base" select="'file:///d:/temp/yr/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 -->
    <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>

输出

<?xml version="1.0" encoding="ISO-8859-1"?>
<yr>
  <testtag>
    <title>Oslo</title>
    <alternate>http://www.yr.no/sted/Norge/Oslo/Oslo/Oslo/</alternate>
    <base>file:///d:/temp/yr/sky/</base>
    <lastupdate>2013-02-27T06:39:00</lastupdate>
    <symbolvar>01d</symbolvar>
    <symbolnr>1</symbolnr>
    <symbolname>Klarv?r</symbolname>
    <precip>0</precip>
    <tempval>2</tempval>
    <speedname>Svak vind</speedname>
    <speedmps>3.1</speedmps>
    <dirdeg>181.3</dirdeg>
    <dircode>S</dircode>
    <dirname>S?r</dirname>
    <Image href="file:///d:/temp/yr/sky/01d.png"/>
  </testtag>
</yr>
于 2013-02-27T09:36:06.100 回答