2013-05-07 90 views
0

我有一個XML文件,其中的轉換規則應該僅適用於某些元素,僅​​基於其屬性值,其餘元素應保留原樣。XSL僅基於屬性對特定元素進行轉換

<bigdata> 
<data> 
    <Object class="QWE" Name="Country-1/State-1/QWE-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="RTY" Name="Country-1/State-1/RTY-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="UIO" Name="Country-1/State-1/UIO-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="PAS" Name="Country-1/State-1/PAS-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
</data> 

上面的XML應低於XML片段,其中僅xml元素對象爲其等於QWE應改爲POST被轉換爲。 即只有第一個元素必須根據其屬性進行更改。 任何對此的建議是gratefull

<bigdata> 
<data> 
    <Object class="POST" Name="Country-1/State-1/POST-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="RTY" Name="Country-1/State-1/RTY-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="UIO" Name="Country-1/State-1/UIO-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="PAS" Name="Country-1/State-1/PAS-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
</data> 

回答

0

使用下面的XSLT轉換上面的XML:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@class[parent::Object]"> 
    <xsl:choose> 
     <xsl:when test=".='QWE'"> 
     <xsl:attribute name="class"> 
      <xsl:value-of select="'POST'"/> 
     </xsl:attribute> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:attribute name="class"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
     </xsl:otherwise> 
    </xsl:choose> 

    </xsl:template> 

參照本作的詳細信息:

XSLT: How to change an attribute value during <xsl:copy>?

+0

如果class =「QWE-1」應該做什麼,我應該保留上面的「-1」。新的值將是class =「POST-1」 – user1529282 2013-05-07 18:45:32

1

嘗試這個:

<?xml version="1.0"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

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

    <xsl:template match="Object/@class[. = 'QWE' ]"> 
      <xsl:attribute name="class"> 
       <xsl:value-of select="'POST'"/> 
      </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

這將產生以下輸出:

<bigdata> 
     <data> 
       <Object class="POST" Name="Country-1/State-1/QWE-1"> 
         <p name="Map">20</p> 
         <p name="Required">0</p> 
         <p name="Combined">68</p> 
         <p name="State">0</p> 
       </Object> 
       <Object class="RTY" Name="Country-1/State-1/RTY-1"> 
         <p name="Map">20</p> 
         <p name="Required">0</p> 
         <p name="Combined">68</p> 
         <p name="State">0</p> 
       </Object> 
       <Object class="UIO" Name="Country-1/State-1/UIO-1"> 
         <p name="Map">20</p> 
         <p name="Required">0</p> 
         <p name="Combined">68</p> 
         <p name="State">0</p> 
       </Object> 
       <Object class="PAS" Name="Country-1/State-1/PAS-1"> 
         <p name="Map">20</p> 
         <p name="Required">0</p> 
         <p name="Combined">68</p> 
         <p name="State">0</p> 
       </Object> 
     </data> 
</bigdata> 

更新如果類值應該具有一個字符串(QWE),只有這部分被啓動應予以更換。試試這個:

<xsl:template match="Object/@class[starts-with(., 'QWE') ]"> 
    <xsl:attribute name="class"> 
     <xsl:value-of select="'POST'"/> 
     <xsl:value-of select="substring-after(.,'QWE')"/> 
    </xsl:attribute> 
</xsl:template> 
+0

如果class =「QWE-1」應該做什麼,我應該保留上面的「-1」。新值將是class =「POST-1」 – user1529282 2013-05-07 18:32:43

+0

請查看更新。 – 2013-05-07 20:09:13