2009-11-20 16 views
5

Ho un file XML dal quale ho bisogno di cancellare un attributo con nome "Id" (deve essere cancellato ovunque appaia) e anche io devo rinominare il tag genitore, mantenendo inalterati i suoi attributi e gli elementi figlio .. Può per favore aiutami a modificare il codice. In un momento, sono in grado di raggiungere solo uno dei due requisiti .. Voglio dire che posso cancellare quell'attributo completamente dal documento o posso cambiare il tag principale .. Ecco il mio codice al quale rimuove l'attributo "Id":XSLT: come modificare il nome del tag principale e cancellare un attributo dal file XML?

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

Si prega di aiutarmi a cambiare il nome del tag genitore da "Root" a "Batch".

risposta

5

Nessuna delle soluzioni proposte risolve davvero il problema : semplicemente rinominano un elemento chiamato "Root" (o anche solo il t op elemento), senza verificare che questo elemento abbia un attributo "Id".

wwerner è il più vicino a una soluzione corretta, ma rinomina il genitore del genitore.

Ecco una soluzione che ha le seguenti proprietà:

  • È corretto.
  • È breve.
  • È generalizzato (il nome di sostituzione è contenuto in una variabile).

Ecco il codice:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:variable name="vRep" select="'Batch'"/> 

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

    <xsl:template match="@Id"/> 

    <xsl:template match="*[@Id]"> 
    <xsl:element name="{$vRep}"> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+0

oh! hai ragione! beh non l'ho mai osservato, infatti nella mia pratica radice XML non avevo mai attributo "id", quindi è passato inosservato tutto il tempo .. Ti sono davvero grato :-) E nulla può negare di accettare questa risposta ..: -) –

2

proverei:

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

primo blocco copia tutti che non è specificato, come si usa. Il secondo sostituisce @id senza che nulla si verifichi. La terza rinomina /Root a /Batch.

+0

vi ringrazio molto. :-) –

2
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()|text()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="@Id" /> 
<xsl:template match="Root"> 
    <Batch> 
    <xsl:copy-of select="@*|*|text()" /> 
    </Batch> 
</xsl:template> 
+2

Root [@Id] diventa Batch [@Id] invece di essere filtrato. La regola radice dovrebbe applicare modelli. –

+0

anziché Ho scritto ha funzionato .. puoi spiegarmi perché xslt si comporta come Questo ? –

+2

copy-of creerà le copie di tutto ciò che è stato selezionato senza riguardo ai modelli esistenti. apply-templates applica i modelli. Esiste un modello per @Id con output nullo. –

2

Questo dovrebbe fare il lavoro:

<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()|text()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="node()[node()/@Id]"> 
     <batch> 
     <xsl:apply-templates select='@*|*|text()' /> 
     </batch> 
    </xsl:template> 

    <xsl:template match="@Id"> 
    </xsl:template> 
</xsl:stylesheet> 

ho provato con il seguente input XML:

<root anotherAttribute="1"> 
<a Id="1"/> 
<a Id="2"/> 
<a Id="3" anotherAttribute="1"> 
    <b Id="4"/> 
    <b Id="5"/> 
</a> 

+1

Come ho capito la domanda, non solo il tag named root dovrebbe essere rinominato, ma tutti i tag parent che contengono un elemento con un attributo Id. Se questo è corretto, la semplice corrispondenza di "Root" non farebbe il lavoro. In caso contrario, è sufficiente abbinare "Root" – wwerner

+0

Grazie mille. :) –

Problemi correlati