2017-05-26 1 views
1

Ich versuche, ein XML zu transformieren, wo der Knoten mehrere Attribute enthält. Davon möchte ich 2 oder 3 Attribute Element und fügen Sie einige zusätzliche Attribute in das gleiche Element. Unten ist die XML-Struktur, die iKonvertieren Sie einige Attributwerte in Element

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

Ich möchte verwandeln diese 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> 

So konvertieren wollen wie ich, dass ich nur 3 Attribut dh attr1 attr5 und attr7 Element sein soll gezeigt hatte und andere, wie es is.For dies zu bleiben habe ich versucht, unter xslt

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

Styling Aber nachdem ich dies für 3 Attribute werden andere Attribute in transformierten xml nicht kommen. Jede Hilfe zu diesem Thema wird

+1

Schwer zu sagen, ohne den Rest Ihres XSLT-Code, aber sind Sie sicher, dass Sie die anderen Attribute in den NODE kopieren? – AntonH

+0

Dies liegt wahrscheinlich daran, dass Ihre XSLT das Attribut 'attr1' hinzufügt, bevor Sie über vorhandene Attribute kopieren, die Sie als Attribute beibehalten möchten. Dies wird gemäß der Spezifikation als Fehler angesehen (siehe https://www.w3.org/TR/xslt#creating-attributes). Wie in diesem Link erwähnt, muss der XSLT-Prozessor die Option verwenden, die Attribute zu ignorieren. –

Antwort

1

geschätzt werden Dies ist nicht perfekt, weil sie die Bedingung für die Aufnahme zweimal wiederholt, aber es funktioniert:

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

Fiddle: http://xsltransform.net/jxDigTS/1

Verwandte Themen