2017-11-06 5 views
2

Kleiner Zusatz, das Beispiel ist ein Teil eines größeren xml, hoffe, ich habe es geklärt.Verwenden von XSLT, um ein XML zu transformieren, so dass ein wiederkehrender Knoten einen eindeutigen Namen bekommt

Ich habe den folgenden Teil einer XML-Datei bekam:

<smartdocuments_root_node xmlns="http://com.logica.digimeente.zaaksysteem"> 
<Zaak> 
<ZaakNummer>21773</ZaakNummer> 
<ZaakID>21768</ZaakID> 
<Titel>Melding klein evenement De grote Kompanjie Barbeque!</Titel> 
<Kenmerken> 
<Kenmerk> 
<KenmerkType>Starttijd evemenent</KenmerkType> 
<Omschrijving>Starttijdevemenent</Omschrijving> 
<Waarde>15:00</Waarde> 
</Kenmerk> 
<Kenmerk> 
<KenmerkType>evement namens</KenmerkType> 
<Omschrijving>evement namens</Omschrijving> 
<Waarde>De Kompanjie</Waarde> 
</Kenmerk> 
<Kenmerk> 
<KenmerkType>Datum evenement</KenmerkType> 
<Omschrijving>Datumevenement</Omschrijving> 
<Waarde>20171101</Waarde> 
</Kenmerk> 
</Kenmerken> 
</Zaak> 
</smartdocuments_root_node> 

Was möchte ich erreichen möchte, ist:

<smartdocuments_root_node xmlns="http://com.logica.digimeente.zaaksysteem"> 
<Zaak> 
<ZaakNummer>21773</ZaakNummer> 
<ZaakID>21768</ZaakID> 
<Titel>Melding klein evenement De grote Kompanjie Barbeque!</Titel> 
<Kenmerken> 
<Kenmerk1> 
<KenmerkType>Starttijd evemenent</KenmerkType> 
<Omschrijving>Starttijdevemenent</Omschrijving> 
<Waarde>15:00</Waarde> 
</Kenmerk1> 
<Kenmerk2> 
<KenmerkType>evement namens</KenmerkType> 
<Omschrijving>evement namens</Omschrijving> 
<Waarde>De Kompanjie</Waarde> 
</Kenmerk2> 
<Kenmerk3> 
<KenmerkType>Datum evenement</KenmerkType> 
<Omschrijving>Datumevenement</Omschrijving> 
<Waarde>20171101</Waarde> 
</Kenmerk3> 
</Kenmerken> 
</Zaak> 
</smartdocuments_root_node> 

oder der Kenmerk Knoten mit dem Wert innerhalb <KenmerkType> umbenennen.

Kann mir jemand helfen?

+0

Sind Sie ganz sicher, dass Sie dies tun wollen? Diese Art von XML ist ein Teufelskerl, mit dem man arbeiten kann (auch wenn man es anpasst, um gut strukturiert zu sein): Niemand wird dir dafür danken, dass du es in eine solche Form gebracht hast. –

Antwort

0

Sie können mit einem identity template beginnen, der die Eingabedaten unverändert kopiert.

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

<Kenmerk> Das Element muss <Kenmerk1>, <Kenmerk2> und so weiter modifiziert werden. Bitte beachten Sie, dass kein Leerzeichen im Knotennamen sein sollte und daher der Wert <KenmarkType> nicht angehängt werden kann. Um die Knoten umzubenennen, können Sie eine Variable mit dem Knotennamen erstellen und die Position des Knotens an sie anhängen.

<xsl:variable name="newNodeName" select="concat(local-name(), position())" /> 

EDIT Der modifizierte Eingang XML hat nun ein Wurzelelement mit einem Namensraum .

<smartdocuments_root_node xmlns="http://com.logica.digimeente.zaaksysteem"> 

Dies zeigt an, dass alle Elemente zu diesem Namensraum gehören, und haben einen Alias ​​für den Namespace, wenn in XSLT zugegriffen werden soll, identifiziert. Hier wurde ein Alias ​​abc als Beispiel verwendet.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:abc="http://com.logica.digimeente.zaaksysteem" > 

Die Elemente müssen dann unter Verwendung des Alias ​​aufgerufen werden.

<xsl:template match="abc:Kenmerk"> 

Unten ist das komplette XSLT.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:abc="http://com.logica.digimeente.zaaksysteem" > 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*" /> 

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

    <xsl:template match="abc:Kenmerk"> 
     <xsl:variable name="newNodeName" select="concat(local-name(), position())" /> 
     <xsl:element name="{$newNodeName}"> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Ausgabe

<smartdocuments_root_node xmlns="http://com.logica.digimeente.zaaksysteem"> 
    <Zaak> 
     <ZaakNummer>21773</ZaakNummer> 
     <ZaakID>21768</ZaakID> 
     <Titel>Melding klein evenement De grote Kompanjie Barbeque!</Titel> 
     <Kenmerken> 
      <Kenmerk1> 
       <KenmerkType>Starttijd evemenent</KenmerkType> 
       <Omschrijving>Starttijdevemenent</Omschrijving> 
       <Waarde>15:00</Waarde> 
      </Kenmerk1> 
      <Kenmerk2> 
       <KenmerkType>evement namens</KenmerkType> 
       <Omschrijving>evement namens</Omschrijving> 
       <Waarde>De Kompanjie</Waarde> 
      </Kenmerk2> 
      <Kenmerk3> 
       <KenmerkType>Datum evenement</KenmerkType> 
       <Omschrijving>Datumevenement</Omschrijving> 
       <Waarde>20171101</Waarde> 
      </Kenmerk3> 
     </Kenmerken> 
    </Zaak> 
</smartdocuments_root_node> 
+0

Vielen Dank, ich fügte ein wenig Informationen hinzu und bin wirklich bemüht, dies zur Arbeit zu bringen. Wirklich zu schätzen, wenn Sie helfen können. –

+0

Das aktualisierte Eingabe-XML enthält jetzt einen Namespace, der vom XSLT zur Identifizierung der Elemente behandelt werden muss. Bitte beachten Sie die aktualisierte Antwort und auch die Erklärung zum Umgang mit Namespaces. –

Verwandte Themen