我在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>
答案 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>
<强>更新强> 我修复了一些错误并验证了转换。这很有效。