2016-06-10 12 views
0

Ich habe eine XML Datei:xml xml-Transformation mithilfe von XSLT - Praktische

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<Cars> 
    <Car> 
     <Color>Blue</Color> 
     <Model>Car2</Model> 
     <Year>1988</Year> 
     <Speed>250</Speed> 
    </Car> 
    <Car> 
     <Color>Blue</Color> 
     <Model>Car2</Model> 
     <Year>1988</Year> 
     <Speed>250</Speed> 
    </Car> 
</Cars> 

ich dies mit XSLT verwandeln wollen haben:

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<vehicles> 
    <vehicle> 
     <vehicleColor>Blue</vehicleColor> 
     <vehicleModel>Car2</vehicleModel> 
     <vehicleYear>1988</vehicleYear> 
     <vehicleSpeed>250</vehicleSpeed> 
    </vehicle> 
    <vehicle> 
     <vehicleColor>Blue</vehicleColor> 
     <vehicleModel>Car2</vehicleModel> 
     <vehicleYear>1988</vehicleYear> 
     <vehicleSpeed>250</vehicleSpeed> 
    </vehicle> 
</vehicles> 

Mein XSLT Datei:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 

     <vehicles> 
      <xsl:for-each select="Cars/Car"> 

       <vehicle> 
        <vehicleColor><xsl:value-of select="Color"/></vehicleColor> 
        <vehicleModel><xsl:value-of select="Model"/></vehicleModel> 
        <vehicleYear><xsl:value-of select="Year"/></vehicleYear> 
        <vehicleSpeed><xsl:value-of select="Speed"/></vehicleSpeed> 
       </vehicle> 

      </xsl:for-each> 
     </vehicles> 

    </xsl:template> 

</xsl:stylesheet> 

Es funktioniert, aber ich möchte wissen, ob meine XSLT Datei korrekt ist und wenn nein, möchte ich Ratschläge.

Auch in meiner Ausgabedatei mit XSLT generiert, habe ich nicht die XML Header. Warum ?

+0

* Es funktioniert, aber ich möchte wissen, ob meine XSLT-Datei korrekt ist * ... wenn es fehlerfrei funktioniert, sollte XSLT korrekt sein. – Parfait

+0

Von _ "es Arbeit .... Ich will Rat" _ meinst du _kann dein XSLT ** optimiert ** werden?_ – MickyD

+0

@MickyD Ja, ich bin wirklich Anfänger in der Umwandlung von XML-Datei –

Antwort

0

Ihr XSLT ist in Ordnung. Ich denke, der beste Weg, diese Frage zu beantworten, um Leuten zu helfen, XSLT zu lernen, besteht darin, Ihre Tags durchzugehen und zu erklären, warum sie richtig funktionieren. Zuerst müssen Sie das XSL-Stylesheet und den Namespace hinzufügen, wie Sie es hier getan haben:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ist boilerplate. Wenn Sie es nicht hatten, wäre die Ausgabe falsch.

Die <xsl:for-each select="Cars/Car"> ruft jedes Element des XML-DOM auf, das mit dem durch select = angegebenen Tag übereinstimmt.

Als Nächstes haben Sie alle Ihre literalen Tags verwendet, um die Namen der Tags in Ihrer Ausgabedatei direkt zu ändern. Ein Tag ist literal in dem Sinne, dass XSLT es einfach in Ihre Ausgabe fallen lässt. Das Tag <xsl:value-of select = someString> schreibt den Wert des Tags in die ursprüngliche Datei, die von someString angegeben wird. Wenn Sie ein Attribut schreiben möchten, benötigen Sie ein @ -Symbol an der ersten Position der Zeichenfolge. Unabhängig davon, mit welchen Daten Sie begonnen haben, enthält Ihre Ausgabedatei die korrekten Ergebnisse. Wenn Sie Zweifel haben, weil Sie, wie Sie sagen, gerade XSLT lernen, erhalten Sie mit einer Testversion von XMLSpy eine großartige Möglichkeit, Ihre XSLT-Dateien zu validieren, um zu überprüfen, ob sie das tun, was Sie wollen.

+0

Vielen Dank für Ihre Antwort. Ist es besser, '' zu verwenden, um alle Namen meiner Futur-Knoten zu definieren? –

+0

@ Azerty123 Verwenden Sie 'xsl: element', wenn Sie den Namen berechnen müssen. Andernfalls verwenden Sie ein literales Ergebniselement. –

0

Ich habe nicht den XML-Header.

Die XML-Deklaration ist optional. Die meisten XSLT-Prozessoren enthalten sie, sofern Sie sie nicht explizit auslassen. Wenn Ihr Prozessor dies nicht tut, versuchen Sie Folgendes hinzuzufügen:

auf die oberste Ebene Ihres stysleetheet.


Ich möchte wissen, ob meine XSLT-Datei korrekt ist

Es ist nichts falsch mit Ihrem Stylesheet.

Wenn Sie jedoch wirklich nur „Fahrzeug“ auf die Namen der Elemente voranstellen, können Sie alles auf einmal tun:

<xsl:template match="/Cars"> 
    <vehicles> 
     <xsl:for-each select="Car"> 
      <vehicle> 
       <xsl:for-each select="*"> 
        <xsl:element name="vehicle{name()}"> 
         <xsl:value-of select="."/> 
        </xsl:element> 
       </xsl:for-each> 
      </vehicle> 
     </xsl:for-each> 
    </vehicles> 
</xsl:template> 
Verwandte Themen