# XSLT Frage



## knowledge (28. Mai 2009)

Hi,

ich will folgendes per XSLT realisieren. In Datei1_alt sind 3 Tags. In Datei1_new sind die gleichen 3 Tags nur mit anderen Werten. Beispiel:

Alt:

<root>
<tag1>wert1</tag1><tag2>wert2</tag2><tag3>wert3</tag3>
</root>

Neu:

<root>
<tag1>Neuer wert1</tag1><tag2>Neuer wert2</tag2><tag3>Neuer wert3</tag3>
</root>

Ich will Beispielsweise nur den Wert von tag2 in Alt gegen den von Neu austauschen. Rauskommen soll dann also:

<root>
<tag1>wert1</tag1><tag2>Neuer wert2</tag2><tag3>wert3</tag3>
</root>

Im Endeffekt geht es also darum bestimmte neue Werte aus einer neuen XML Datei in eine alte zu übertragen. Ich dachte mir ich filtere aus der neuen Datei den Wert von Tag 2 und ersetze ihn dann in der alten Datei. Das alles sollte mit XSLT realisiert werden. Hat jemand eine Idee?


----------



## Golem386 (14. Jun 2009)

Hi,
es wäre schön, wenn du dir nächstesmal einen etwas präziseren Titel für deinen Thread überlegen würdest.
Viele antworten auf solche Threads auch gar nicht.

MfG


----------



## SlaterB (14. Jun 2009)

na mit deinen 8 Beiträgen (edit: 10) klingt das jetzt etwas komisch,
wenn du schon auf 100 derartige Threads mit besserem Titel geantwortet hast, dann könntest du solche Forderungen stellen 

im Übrigen nach über zwei Wochen insgesamt eher kontraproduktiver Beitrag, das Thema war doch quasi schon beendet,
nun reaktiviert


----------



## Golem386 (14. Jun 2009)

Mag sein, dass ich noch kein "Halbes Gigabyte" - Benutzer bin, aber dIeses Forum ist ja nicht das einzige. Ich existiere auch sonst noch wo...

Ich habe nur in der Hoffnung geantwortet, dass der Autor sich nächstesmal einen besseren überlegt.
(Optimal wäre zweifelsohne das Lesen des "Vor dem ersten Posten bitte lesen" Threads, der ja nicht ohne Grund vom Administrator gepostet wurde, aber das tuen ja die wenigsten. Leider.)


----------



## xml_looser (20. Jun 2009)

Hallo hier mein Versuch

ich geht davon das die Strucktur der Xml-dateien gleich sind

über den Umweg DTD ENTITY werden beide Dateien zusammengeführt

zu Übersicht habe ich dies in Komentare gesetzt
Vorteil ist auch das die xml dateien jeder Zeit geändert werden

über den Parser kann dann der Name der Ergebnisxml angeben werden
der doppelte root Tag ist damit Neu.xml owie Alt.xml valid bleiben

Auswertung.xml
[XML]

<?xml version="1.0"?>
<!DOCTYPE root [
<!ELEMENT tag3 (#PCDATA)>
<!ELEMENT tag2 (#PCDATA)>
<!ELEMENT tag1 (#PCDATA)>
<!ELEMENT root ((root+ | (tag1, tag2, tag3)))>
<!ENTITY alt   SYSTEM "alt.xml">
<!ENTITY neu SYSTEM "neu.xml">

]>
<root>
	<!-- Alte Werte -->
	<!--
	<root>
		<tag1>wert1</tag1>
		<tag2>wert2</tag2>
		<tag3>wert3</tag3>
	</root>
	-->
	&alt;
	<!-- Neue Wert -->
	<!--
	<root>
		<tag1>wert1</tag1>
		<tag2>Neuer wert2</tag2>
		<tag3>wert3</tag3>
	</root>
	-->
	&neu;
</root>

[/XML]
neu.xml
[XML]
<root>
	<tag1>wert12</tag1>
	<tag2>Neuer wert22</tag2>
	<tag3>wert32</tag3>
</root>
[/XML]
alt.xml
[XML]
<root>
	<tag1>wert1</tag1>
	<tag2>wert2</tag2>
	<tag3>wert3</tag3>
</root>
[/XML]
auswertung.xsl
[XML]
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xslutput indent="yes" method="xml"/>
	<xsl:template match="/">
		<xsl:apply-templates select="root"/>
	</xsl:template>
	<xsl:template match="root">
	<root>
		<xsl:for-each select="root[1]/*">
			<xsl:variable name="pos" select="position()"/>
			<xsl:variable name="alt" select="."/>
			<xsl:variable name="neu" select="../../*[2]/*[$pos]"/>
			<xsl:choose>
				<xsl:when test="$alt != $neu">
					<xsl:element name="{local-name()}">
						<xsl:value-of select="$neu"/>
					</xsl:element>
				</xsl:when>
				<xsltherwise>
				<xsl:element name="{local-name()}">
						<xsl:value-of select="$alt"/>
					</xsl:element>
				</xsltherwise>
			</xsl:choose>
		</xsl:for-each>
		</root>
	</xsl:template>
</xsl:stylesheet>
[/XML]
ergebnis
[XML]
<?xml version='1.0' ?>
<root>
  <tag1>wert1</tag1>
  <tag2>Neuer wert2</tag2>
  <tag3>wert3</tag3>
</root>
[/XML]


----------

