我正在尝试将 XML 文件中的预测数据提取到我的 XSLT 1.0 中。我是这些语言的新手,所以我多次使用相同的代码行。给定代码的差异只是 for-each 循环上的属性@aac。
<xsl:for-each select="product/forecast/area[@aac='SA_PT001']">
<xsl:value-of select="@description" /> :
<xsl:value-of select="forecast-period/text[@type='precis']"/> : Min
<xsl:value-of select="forecast-period/element[@type='air_temperature_minimum']"/> : Max
<xsl:value-of select="forecast-period/element[@type='air_temperature_maximum']"/><br/>
</xsl:for-each>
<xsl:for-each select="product/forecast/area[@aac='QLD_PT015']">
<xsl:value-of select="@description" /> :
<xsl:value-of select="forecast-period/text[@type='precis']"/> : Min
<xsl:value-of select="forecast-period/element[@type='air_temperature_minimum']"/> : Max
<xsl:value-of select="forecast-period/element[@type='air_temperature_maximum']"/><br/>
</xsl:for-each>
<xsl:for-each select="product/forecast/area[@aac='NSW_PT027']">
<xsl:value-of select="@description" /> :
<xsl:value-of select="forecast-period/text[@type='precis']"/> : Min
<xsl:value-of select="forecast-period/element[@type='air_temperature_minimum']"/> : Max
<xsl:value-of select="forecast-period/element[@type='air_temperature_maximum']"/><br/>
</xsl:for-each>
你能告诉我使用循环或 XSL 模板来减小代码大小的想法吗?
您可以将 for-each 的正文更改为模板:
<xsl:template match="area">
<xsl:value-of select="@description" /> :
<xsl:value-of select="forecast-period/text[@type='precis']"/> : Min
<xsl:value-of select="forecast-period/element[@type='air_temperature_minimum']"/> : Max
<xsl:value-of select="forecast-period/element[@type='air_temperature_maximum']"/><br/>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="product/forecast/area[@aac='SA_PT001']"/>
<xsl:apply-templates select="product/forecast/area[@aac='QLD_PT015']"/>
<xsl:apply-templates select="product/forecast/area[@aac='NSW_PT027']"/>
</xsl:template>
这将首先为您提供所有SA_PT001
区域,然后是所有QLD_PT015
区域,依此类推。 您可以使用以下方法将三个选择合并为一个
<xsl:template match="/">
<xsl:apply-templates select="product/forecast/area[@aac='SA_PT001' or @aac='QLD_PT015' or @aac='NSW_PT027']"/>
</xsl:template>
但这将为您提供三个aac
值中任何值的所有区域,按文档顺序排列,而不是按aac
分组。
编辑:您说要按描述的字母顺序排序:
<xsl:template match="/">
<xsl:apply-templates select="product/forecast/area[@aac='SA_PT001' or @aac='QLD_PT015' or @aac='NSW_PT027']">
<xsl:sort select="@description" />
</xsl:apply-templates>
</xsl:template>
将按描述对它们进行排序。 您可以使用多个<xsl:sort>
以便
<xsl:template match="/">
<xsl:apply-templates select="product/forecast/area[@aac='SA_PT001' or @aac='QLD_PT015' or @aac='NSW_PT027']">
<xsl:sort select="@aac" />
<xsl:sort select="@description" />
</xsl:apply-templates>
</xsl:template>
将首先按aac
分组,然后在每个aac
组中按描述排序。
<xsl:variable name="aac_list">NSW_PT027,QLD_PT015,NSW_PT027</xsl:variable>
<xsl:for-each select="product/forecast/area">
<xsl:sort select="@description"/>
<xsl:if test="contains($aac_list, ./@aac)">
<xsl:value-of select="@description" /> :
<xsl:value-of select="forecast-period/text[@type='precis']"/> : Min
<xsl:value-of select="forecast-period/element[@type='air_temperature_minimum']"/> : Max
<xsl:value-of select="forecast-period/element[@type='air_temperature_maximum']"/><br/>
</xsl:if>
</xsl:for-each>
aac_list
可以动态构建的变量