marcoborn
Goto Top

Knoten in XML verschieben, Teil 2

Hallo Forum,
ich habe letzte Woche eine Frage zu XML hier gepostet: Knoten in XML-Dokument verschieben
Dazu hat sich jedoch noch eine Rückfrage ergeben. Vielleicht kann mir jemand noch einen Tipp geben, wie ich die Transformation anpassen muss, damit auch die Unterknoten mit verschoben werden. Aus
<INDI_L0 OrigID="@I10@" >  
    <NAME_L1 Value="Kurt Andres" />  
    <SEX_L1 Value="M" />  
    <_UID_L1 Value="db4b4267-51e8-4f66-9272-29187e29b57c" />  
    <BIRT_L1 Value="">  
      <DATE_L2 Value="18 JUN 1927" />  
      <PLAC_L2 Value="Hannover" />  
      <NOTE_L2 Value="Nordstadtkrankenhaus" >  
        <CONT_L3 Value ="Gewicht: 3,5 kg" />  
        <CONT_L3 Value ="Größe: 48 cm" />  
      </NOTE>
    </BIRT_L1>
    <DEATH_L1 Value="">  
      <DATE_L2 Value="21 JUN 1927" />  
      <PLAC_L2 Value="Mannheim" />  
      <NOTE_L2 Value="abends 21.03 Uhr" />  
    </DEAT_L1>
  </INDI_L0>
soll letztlich folgendes erzeugt werden:
  <INDI_L0 OrigID="@I10@" >  
    <NAME_L1 Value="Kurt Andres" />  
    <SEX_L1 Value="M" />  
    <_UID_L1 Value="db4b4267-51e8-4f66-9272-29187e29b57c" />  
    <BIRT_L1 Value="">  
      <DATE_L2 Value="18 JUN 1927" />  
      <PLAC_L2 Value="Hannover" />  
    </BIRT_L1>
    <DEATH_L1 Value="">  
      <DATE_L2 Value="21 JUN 1927" />  
      <PLAC_L2 Value="Mannheim" />  
    </DEAT_L1>
    <NOTE_L1 Value="Geburt: Nordstadtkrankenhaus" >  
        <CONT_L2 Value ="Gewicht: 3,5 kg" />  
        <CONT_L2 Value ="Größe: 48 cm" />  
    </NOTE>
    <NOTE_L1 Value="Tod:abends 21.03 Uhr" />  
  </INDI_L0>

Vielen Dank,
M. Born

Content-ID: 622967

Url: https://administrator.de/contentid/622967

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

Printe
Lösung Printe 16.11.2020 aktualisiert um 17:00:54 Uhr
Goto Top
noch einen Tipp geben
Tipp: XSLT <xsl:for-each> Element

Hier für dich als Mini-Hausaufgabe: Fülle im modifizierten Ausschnitt die Lücke mit den Punkten
        <xsl:template match="//DEATH_L1/NOTE_L2">  
	  <NOTE_L1 Value="Tod:{@Value}">  
		<xsl:for-each select="CONT_L3">  
			..............
		</xsl:for-each>
	  </NOTE_L1>
	</xsl:template>
	
	<xsl:template match="//BIRT_L1/NOTE_L2">  
	  <NOTE_L1 Value="Geburt:{@Value}">  
		<xsl:for-each select="CONT_L3">  
			.............
		</xsl:for-each>
	  </NOTE_L1>
	</xsl:template>



Btw. dein hier gepostetes XML is übrigens alles andere als "valid", wenn man das noch nicht mal voher kontrolliert, ts ts ts.
MarcoBorn
MarcoBorn 17.11.2020 um 08:38:13 Uhr
Goto Top
Guten Morgen,
vielen Dank für den Hinweis auf for-each. Nach etwas probieren habe ich jetzt eine funktionierende Transformation. Das von mir gepostete XML war nur als verkürztes Beispiel gedacht. Alle nicht für mein Problem relevanten Teile habe ich dort weggelassen.

Viele Grüße,
M. Born
Printe
Printe 17.11.2020 aktualisiert um 12:40:12 Uhr
Goto Top
Zitat von @MarcoBorn:
Das von mir gepostete XML war nur als verkürztes Beispiel gedacht. Alle nicht für mein Problem relevanten Teile habe ich dort weggelassen.
Man sollte aber zumindest die Element-Namen darin richtig schreiben, XML verzeiht keine Schlampigkeiten face-wink
</DEAT_L1>
MarcoBorn
MarcoBorn 17.11.2020 um 15:45:36 Uhr
Goto Top
Das Tag für den Tod wird in der von mir benutzten Specifikation tatsächlich mit DEAT und nicht mit DEATH abgekürzt.
Printe
Printe 17.11.2020 aktualisiert um 15:48:30 Uhr
Goto Top
Dann muss aber auch der Anfangs-Tag DEAT_L1 und nicht DEATH_L1 heißen! Ein "non matching" Anfangstag ohne zugehörigen End-Tag führt zwangsläufig zu invalidem XML.