2011-10-06 33 views
0

我有XML數據樣本塊。每個數據都有一個稱爲「開關」的屬性,指定開關是關閉還是開啓(默認值爲關閉)。 目標是通過XSLT作爲塊的屬性添加此信息。這個新的atttribute「動作」指定了數據塊中的開關是關閉還是開啓。XSLT 1.0:分析設置的變化

情況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

如果您知道<data>元素中最多隻能有switch屬性的一個轉換,則應該足以檢查<block>中第一個和最後一個<data>元素的值。下面是一個未經測試的嘗試:

<?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> 

更新 我修正了一些錯誤,並驗證了改造。這工作。