2017-05-26 83 views
1

我正在嘗試轉換一個xml,其中包含多個屬性。其中,我希望2或3個屬性成爲元素,並在同一元素中插入一些額外的屬性。下面是XML結構,我想轉換將某個屬性值轉換爲元素

 <Parent> 
      <NODE attr1="INDEX" attr2="0" attr3="OFF" attr4="TRANSPARENT_MODE" attr5="HIGH" attr6="0" attr7="0" attr8="TIME"> 
      <value>0</value> 
      <alias>Index 0</alias> 

      </NODE > 
    </Parent> 

我想我已經表明我只想要3屬性即attR1位attr5和attr7是元素添加到XML轉換到

<Parent> 
       <NODE attr2="0" attr3="OFF" attr4="TRANSPARENT_MODE" attr6="0" attr8="TIME"> 
       <attr1 value="INDEX"> 
       <attr5 value="HIGH"> 
       <attr7 value="0"> 
       <value>0</value> 
       <alias>Index 0</alias> 

       </NODE > 
     </Parent> 

所以和其他留下來,因爲它is.For這個我想下面的XSLT樣式

<xsl:template match="Parent/NODE/@attr1"> 
<attr1> 
<xsl:attribute name="value"><xsl:value-of select="." /></xsl:attribute> 
</attr1> 
</xsl:template> 

但做這3個屬性後,其他屬性沒有改變XML來了。任何幫助可以理解

+1

很難說沒有其餘的XSLT代碼,但是您確定要將其他屬性複製到NODE中嗎? – AntonH

+0

這可能是因爲您的XSLT在複製任何想要作爲屬性保留的現有屬性之前添加'attr1'元素。根據規範,這被視爲錯誤(請參閱https://www.w3.org/TR/xslt#creating-attributes)。正如在該鏈接中提到的那樣,您的XSLT處理器必須選擇忽略屬性。 –

回答

1

這不是完美的,因爲它重複列入兩次的條件,但它的工作原理:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="NODE"> 
     <xsl:copy> 
      <xsl:for-each select="@*[name()!='attr1' and name()!='attr3']"> 
       <xsl:copy /> 
      </xsl:for-each> 
      <xsl:for-each select="@*[name()='attr1' or name()='attr3']"> 
       <xsl:element name="{name()}"> 
        <xsl:attribute name="value" select="."/> 
       </xsl:element> 
      </xsl:for-each> 
      <xsl:for-each select="node()"> 
       <xsl:copy-of select="." /> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

小提琴:http://xsltransform.net/jxDigTS/1

相關問題