1

我正在尝试将预测数据从 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 模板来减少代码大小吗?

4

2 回答 2

1

您可以将 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组内按描述排序。

于 2012-10-01T14:30:26.963 回答
0
<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您可以动态构建的变量

于 2012-10-01T13:17:16.197 回答