2016-03-19 6 views
0

Ich habe den folgenden XML-Code:Xslt wie spezielle Attribute hinzufügen zu kopieren-of

<root> 
<Kursstamm> 
    <Texteinmischdefinitionen> 
     <Texteinmischung Typ="Text" Position="Vorlauftext">Text A</Texteinmischung> 
    </Texteinmischdefinitionen> 
    <KursstammID>Text B 
</KursstammID> 
<Kursstammtitel>Text C</Kursstammtitel> 
<Kurztext>Text D</Kurztext> 
<Kursgebühr>Price</Kursgebühr> 
<Trainerprosa>Text E</Trainerprosa> 
    <Texteinmischdefinitionen> 
    <Texteinmischung Typ="Text" Position="Hinweistext">Text F </Texteinmischung> 
    </Texteinmischdefinitionen> 
</Kursstamm> 
</root> 

Und Ich mag es zu verarbeiten, mit XSLT:

Text A 
Text B 
Text C 
Text D 
Text E 
Text F 

Ich habe Probleme mit Text A und Text F!

Ich benutze dieses XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/> 
<xsl:template match="/root/Kursstamm"> 
<xsl:copy-of select="Texteinmischung[@Typ='Vorlauftext']" /> 
<xsl:copy-of select="KursstammID"/> 
<xsl:copy-of select="Kurztext"/> 
<xsl:copy-of select="Kursgebühr"/> 
<xsl:copy-of select="Trainerprosa"/> 
<xsl:copy-of select="Nachlauf"/> 
<xsl:copy-of select="Texteinmischung[@Typ='Hinweistext']" /> 
</xsl:template> 
</xsl:stylesheet> 

Aber es ist nicht

<Texteinmischung Typ="Text" Position="Vorlauftext"> 

oder

<Texteinmischung Typ="Text" Position="Hinweistext"> 

Wie kann ich die Tags mit den Attributen finden gekommen?

Vielen Dank für Ihre Hilfe!

+0

Wenn Sie nach etwas fragen, mit '@ Typ =„Hinweistext“', warum sollte man es erwarten zu finden etwas mit '@ Position =" Hinweistext "'? –

Antwort

1

Für die problematischen copy-of, versuchen Sie stattdessen:

<xsl:copy-of select=".//*[@Typ]" /> 

(weil der Kontextknoten an diesem Punkt ein Kursstamm Element ist, und jene Texteinmischung des mit einem „Typ“ Attribute zu packen, müssen Sie gehen tiefer auf Kursstamm Nachkommen Achse, bekommen nicht nur seine direkten Kinder, daher die Verwendung von „.//*“ in diesem Fall)

‚HTH,

+0

Es funktioniert, wenn in der Struktur immer alle Tags verfügbar sind. In meinem XML ist das leider nicht der Fall. So bekomme ich wenn – user2211417

+0

Entschuldigung - nochmal: Es funktioniert, wenn in der Struktur immer alle Tags verfügbar sind. In meinem XML ist das leider nicht der Fall. So bekomme ich wenn nein ( Text F ) "F" - ein "Text A" an dieser Stelle! Ich brauche das Attribut Äther Typ = "Text" Position = "Vorlauftext" oder Typ = "Text" Position = "Hinweistext" Danke für Ihre Hilfe angeben! – user2211417

1

YSharp haben Sie an Ihrem spezielles Problem zu beantworten, aber Sie Vielleicht interessiert es zu wissen, dass es einen anderen Ansatz gibt kann nehmen, die Vorteile von XSLT built-in templates rules nutzt. Wenn Sie nur die verschiedenen Textknoten ausgeben müssen, müssen Sie nur eine einzige Vorlage verwenden, die Textknoten entspricht, in denen Sie den Text mit einem Zeilenumbruch ausgeben.

Versuchen Sie, diese XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="text()"> 
     <xsl:value-of select="normalize-space()" /> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

Beachten Sie die Verwendung der xsl:strip-space white-space nur Knoten zu ignorieren.

Wenn Sie wollten bestimmte Elemente ignorieren, wie Kursgebühr nur eine zusätzliche Vorlage wie folgt hinzu:

<xsl:template match="Kursgebühr" /> 
+0

Danke für den Hinweis! – user2211417

Verwandte Themen