我正在尝试将一些 XML 输出转换为评级表(与水文相关),该表由顶部的百分之一值和下降的十分之一值组成。我遇到的问题是我似乎无法通过在 ht 属性上使用子字符串来对唯一值进行排序。
以下是 XML 输出的示例:
<env:Envelope>
<env:Header/>
<env:Body>
<RatingTableUpdate>
<Gauge xmlns="" type="STORAGE" id="123">
<Input input="0">
<Conv ht="19.76" cap="5040" />
<Conv ht="19.77" cap="5045" />
<Conv ht="19.78" cap="5051" />
<Conv ht="19.79" cap="5057" />
<Conv ht="19.80" cap="5063" />
<Conv ht="19.81" cap="5069" />
<Conv ht="19.82" cap="5074" />
<Conv ht="19.83" cap="5080" />
<Conv ht="19.84" cap="5086" />
<Conv ht="19.85" cap="5092" />
<Conv ht="19.86" cap="5098" />
<Conv ht="19.87" cap="5104" />
<Conv ht="19.88" cap="5109" />
<Conv ht="19.89" cap="5115" />
<Conv ht="19.90" cap="5121" />
<Conv ht="19.91" cap="5127" />
<Conv ht="19.92" cap="5133" />
<Conv ht="19.93" cap="5138" />
</Input>
</Gauge>
</RatingTableUpdate>
</env:Body>
</env:Envelope>
输出应如下所示:
GH 0.00 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09
19.7 5040 5045 5051 5057
19.8 5063 5069 5074 5080 5086 5092 5098 5104 5109 5115
19.9 5121 5127 5133 5138
我能够在正确的列中获取 cap 属性,但无法使 GH 列(删除百分之一值的 ht 属性)每行仅显示一次。我得到这样的东西:
GH 0.00 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09
19.7 5040
5045
5051
5057
19.8 5063
5069
5074
5080
5086
5092
5098
5104
5109
5115
19.9 5121
5127
5133
5138
这是我格式化此部分的 xsl 部分。xsl:choose 似乎适用于列。我已经尝试过 Muenchian 方法,但不能完全正确(很难让它与子字符串键一起工作)。
这是最好的方法,还是有另一种方法让每一行对给定的子字符串只显示一次(19.7 一次,19.76、19.77、19.78、19.79 值)? 评分通常像示例一样从非零值开始,所以我不能只使用百分之一的 0 值来开始一个组,而使用 9 来结束一个组。
<xsl:for-each select="env:Envelope/env:Body/RatingTableUpdate/Gauge">
<table width="100%">
<tr class="site">
<td width="150px">Site ID: <u><xsl:value-of select="@id" /></u></td>
<td>Site Name: <u><xsl:value-of select="@idname" /></u></td>
<td>Type: <u><xsl:value-of select="@type" /></u></td>
</tr>
</table>
<table width="100%">
<tr class="tbldata">
<th rowspan="1" class="tbldataheader">GH</th>
<th rowspan="1" class="tbldataheader">0.00</th>
<th rowspan="1" class="tbldataheader">0.01</th>
<th rowspan="1" class="tbldataheader">0.02</th>
<th rowspan="1" class="tbldataheader">0.03</th>
<th rowspan="1" class="tbldataheader">0.04</th>
<th rowspan="1" class="tbldataheader">0.05</th>
<th rowspan="1" class="tbldataheader">0.06</th>
<th rowspan="1" class="tbldataheader">0.07</th>
<th rowspan="1" class="tbldataheader">0.08</th>
<th rowspan="1" class="tbldataheader">0.09</th>
</tr>
<xsl:for-each select="./Input/Conv">
<tr class="tbldata">
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 0">
<td class="ifrtext"><xsl:value-of select="substring(@ht,1,string-length(@ht)-1)" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 0">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 1">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 2">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 3">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 4">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 5">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 6">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 7">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 8">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="substring(@ht,string-length(@ht),1) = 9">
<td class="ifrtext"><xsl:value-of select="@cap" /></td>
</xsl:when>
<xsl:otherwise>
<td class="ifrtext"></td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
谢谢,马特