XSLT 1.0:分析设置的变化

时间:2011-10-06 18:54:29

标签: xml xslt

我在XML中有数据块样本。每个数据都有一个名为“switch”的属性,指定开关是关闭还是开启(默认值为关闭)。 目标是通过XSLT作为块的属性来添加此信息。这个新的atttribute“action”指定数据块中的开关是关闭还是打开。

案例1:

<block>
    <data switch="true">2.4</data>  
    <data switch="true">2.4</data>
    <data>270.0</data>
    <data>244.79999999999998</data>
    <data>330.59999999999997</data>
</block>

转换为

<block action="turnedOFF">
    <data switch="true">2.4</data>
    <data switch="true">2.4</data>
    <data>270.0</data>
    <data>244.79999999999998</data>
    <data>330.59999999999997</data>
</block>

案例2:相反,下面的xml:

<block>
    <data>270.0</data>
    <data>244.79999999999998</data>
    <data>330.59999999999997</data>
    <data switch="true">2.4</data>
    <data switch="true">2.4</data>
</block>

将转变为:

<block action="turnedON">
    <data>270.0</data>
    <data>244.79999999999998</data>
    <data>330.59999999999997</data>
    <data switch="true">2.4</data>
    <data switch="true">2.4</data>
</block>

1 个答案:

答案 0 :(得分:1)

如果您知道switch元素中的<data>属性最多只能有一次转换,那么检查第一个和最后一个<data>元素的值应该足够了一个<block>。这是一个未经测试的尝试:

<?xml version="1.0" encoding="utf-8"?>

    

<xsl:template match="block">
    <block>
        <xsl:if test="data[1]/@switch and not(data[last()]/@switch)">
            <xsl:attribute name="action">turnedOFF</xsl:attribute>
        </xsl:if>
        <xsl:if test="not(data[1]/@switch) and data[last()]/@switch">
            <xsl:attribute name="action">turnedON</xsl:attribute>
        </xsl:if>
        <xsl:apply-templates select="@*|node()" />
    </block>
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<强>更新 我修复了一些错误并验证了转换。这很有效。