添加属性到输出的根元素

时间:2015-09-29 23:23:00

标签: xml xslt

所以我需要在我使用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>

1 个答案:

答案 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>