所以我需要在我使用XSLT创建的XML输出的根元素(< weather>)中添加4个属性。 4个要素是从中获取数据的气象站的详细信息。其中包含在stations.xml文件中,其结构如下:
<stations>
<station>
<site>81123</site>
<name>Bendigo Airport</name>
<latitude>36.74</latitude>
<longitude>144.33</longitude>
<state>Vic</state>
</station>
<station>
<site>81124</site>
<name>Yarrawonga</name>
<latitude>36.03</latitude>
<longitude>146.03</longitude>
<state>Vic</state>
</station>
</stations>
XPath测试人员告诉我,以下将是获得所需站节点的正确谓词。
./stations/station[site=81123]
我试图通过匹配来做到这一点,但我想我已经迷失了方向。如果有人能提供一些很棒的帮助。我到目前为止的代码如下:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<!-- select the <measurement> elements of all the various input files -->
<xsl:variable name="maxTemp" select="document('Max_temp.xml')/*" />
<xsl:variable name="rainfall" select="document('Rainfall.xml')/*" />
<xsl:variable name="solar" select="document('Solar.xml')/*" />
<xsl:variable name="minTemp" select="document('Min_temp.xml')/*" />
<xsl:variable name="stations" select="document('station.xml')/*" />
<!-- index <measurement> elements by their station and date -->
<xsl:key name="kMeasurement" match="measurement"
use="concat(Day, '/', Month, '/', Year)"
/>
<xsl:template match="/">
<weather>
<xsl:apply-templates select="weather" />
<xsl:apply-templates select="$maxTemp/measurement" />
</weather>
</xsl:template>
<xsl:template match="weather">
<xsl:attribute name="stationID"><xsl:value-of select="$stations/station[site=81123]/site" /></xsl:attribute>
<xsl:attribute name="stationName"><xsl:value-of select="$stations/station[site=81123]/name" /></xsl:attribute>
<xsl:attribute name="latitude"><xsl:value-of select="$stations/station[site=81123]/latitude" /></xsl:attribute>
<xsl:attribute name="longitude"><xsl:value-of select="$stations/station[site=81123]/longitude" /></xsl:attribute>
</xsl:template>
<xsl:template match="measurement">
<xsl:variable name="currentKey" select="concat(Day, '/', Month, '/', Year)" />
<measurement>
<Date><xsl:value-of select="concat(Day, '/', Month, '/', Year)" /></Date>
<!-- since we are handling maxTemp measurements here, we can output that directly -->
<MaxTemp><xsl:value-of select="MaxTemp"/></MaxTemp>
<!-- to access the others we need a context switch and a key lookup -->
<xsl:for-each select="$rainfall">
<Rainfall><xsl:value-of select="key('kMeasurement', $currentKey)/Volume" /></Rainfall>
</xsl:for-each>
<xsl:for-each select="$solar">
<Solar><xsl:value-of select="key('kMeasurement', $currentKey)/dailySolarExposure" /></Solar>
</xsl:for-each>
<xsl:for-each select="$minTemp">
<MinTemp><xsl:value-of select="key('kMeasurement', $currentKey)/minTemp" /></MinTemp>
</xsl:for-each>
</measurement>
</xsl:template>
答案 0 :(得分:1)
为了最大限度地减少手头问题的示例,请使用以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="stations" select="document('station.xml')/*" />
<xsl:template match="/">
<weather>
<xsl:variable name="station" select="$stations/station[site=81123]" />
<xsl:attribute name="stationID"><xsl:value-of select="$station/site" /></xsl:attribute>
<xsl:attribute name="stationName"><xsl:value-of select="$station/name" /></xsl:attribute>
<xsl:attribute name="latitude"><xsl:value-of select="$station/latitude" /></xsl:attribute>
<xsl:attribute name="longitude"><xsl:value-of select="$station/longitude" /></xsl:attribute>
<!-- create content here -->
</weather>
</xsl:template>
将返回:
<?xml version="1.0" encoding="UTF-8"?>
<weather stationID="81123" stationName="Bendigo Airport" latitude="36.74" longitude="144.33"/>
如果它针对有效的XML输入运行,并且名为station.xml
的文档位于样式表所在的同一目录中。
如果您愿意,可以将上述代码缩短为:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="stations" select="document('station.xml')/*" />
<xsl:template match="/">
<xsl:variable name="station" select="$stations/station[site=81123]" />
<weather stationID="{$station/site}" stationName="{$station/name}" latitude="{$station/latitude}" longitude="{$station/longitude}">
<!-- create content here -->
</weather>
</xsl:template>
</xsl:stylesheet>