如何使用模板或循环来最小化 xsl 中的代码



我正在尝试将 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可以动态构建的变量

相关内容

  • 没有找到相关文章

最新更新