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ただし、これにより、グループ化するのではなく、ドキュメントの順序で3 つの値のいずれかのすべての領域が得られます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 に答える