XSLT Frage: XML nach XML

berniebert

Grünschnabel
Hallo zusammen,
ich möchte mit xslt eine XML-file in eine andere XML-file transformieren. Die Output-file ist ein Auszug aus der Input-file. Sie soll alle Elemente <book type="novel"> (inkl aller Attribute) sowie dessen Children <author> (inkl aller Children, Attribute, etc) enthalten. Wie kriege ich das hin? Hat jemand einen Tipp oder Codeschnipsel? Vielen Dank! B

input:

Code:
<shelf>

<book type="novel">
<author><name>Kipling</name></author>
<year>1851</year>
<title>moby dick</title>
</book>

<book type="drama">
<author><name>Shakespeare</name></author>
<year>...</year>
...
</book>

</shelf>

output:

Code:
<shelf>

<book type="novel">
<author><name>Kipling</name></author>
</book>

</shelf>
 
Hallo,

grob gesagt, kannst machst du für alles was du nicht willst ein leeres Template und für alles was du willst ein Template das die Daten so in die Datei schreibt wie du es möchtest.

MFG

zEriX
 
mmh. Verstehe ich leider nicht. Muss ich dann jeden Fall, der nicht meiner "Auswahl" entspricht explizit ausschliessen? Hab mit XSLT noch nicht viel gemacht. Hier ist mal mein Ansatz, der aber leider nicht funktioniert:

Input (nochmal komplett):

Code:
<shelf>
	<book type="novel">
		<author>
			<name>Kipling</name>
		</author>
		<year>1851</year>
		<title>Moby Dick</title>
	</book>
	
	<book type="drama">
		<author>
			<name>Shakespeare</name>
		</author>
		<year>1599</year>
		<title>Hamlet</title>
	</book>
</shelf>

XSL:

Code:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<xsl:copy-of select="/*/book[@type='novel']/author"></xsl:copy-of>
</xsl:template>
</xsl:stylesheet>

Output mit diesem XSL:

Code:
<author><name>Kipling</name></author>

Da fehlt aber noch das Element <book> mit Attributen....

Thx B
 
Du sagst ja im moment auch nur, dass er das Element kopieren soll.
Wenn ich mich richtig erinnere wird bei copy-of das ganze Element kopiert, also auch mit Kind-Elementen.
Die erste Idee die ich jetzt hab ist, die ganzen Elemente die du brauchst selbst wieder neu aufbauen.

Hier kkannst du dir mal anschauen wie man templates nutzt.

MFG

zEriX
 
danke für deine tipps, habs mittlerweile hiinbekommen!
Code:
<xsl:template match="shelf">
  <shelf>
    <xsl:apply-templates/>
  </shelf>
</xsl:template>

<xsl:template match="book">
<xsl:if test="@type='novel' ">
  <book type="{@type}">
    <xsl:copy-of select="author"/>
  </book>
</xsl:if>
</xsl:template>
 
Ich wollte auch, dass du es selbst hin bekommst. Bringt ja nichts wenn ich dir die Lösung sage. :)

MFG

zEriX
 

Neue Beiträge

Zurück