2011-01-04 6 views
0

Meine XML ist 'input.xsl'Mein xslt produziert nicht korrekte Ausgabe?

 <?xml version="1.0" encoding="ISO-8859-1"?> 
    <?xml-stylesheet type="text/xsl" href="input.xsl"?> 
     <catalog> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
     </catalog> 

Jetzt möchte ich mit Hilfe von XSLT, wie folgend, (OUTPUT-Format)

 <?xml version="1.0" encoding="ISO-8859-1"?> 
     <catalog> 
     <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     </cd> 
     <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     </cd> 
      </catalog> 

Dafür ein anderes XML-Dokument unter Verwendung der obigen XML-Datei zu erzeugen, ich xsl-Datei ‚input.xsl‘

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

    <xsl:template match="/"> 
     <xsl:element name="catalog"> 
      <xsl:apply-templates select="catalog/cd/title"/> <br/> 
      <xsl:apply-templates select="catalog/cd/artist"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="catalog/cd/artist"> 
     <xsl:element name="cd"> 
      <xsl:value-of select="current()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="catalog/cd/title"> 
     <xsl:element name="cd"> 
      <xsl:value-of select="current()"/> 
     </xsl:element> 
    </xsl:template> 
    </xsl:stylesheet> 

die obige xsl-Datei erstellt nicht die Ausgabe im xML-Format erzeugen. Also, was ist das Problem in meinem Code. Führe mich. Danke im Voraus.

Antwort

1

Sie verbrauchen die Pfade, auf die Sie zugreifen möchten, in der SELECT-Klausel Ihres Aufrufs. Denken Sie daran, dass jeder Knoten, der übereinstimmt, der aktuelle Knoten wird, von dem alle nachfolgenden relativen XPath-Ausdrücke ausgewertet werden. Außerdem müssen Sie nicht ständig Elemente erstellen - setzen Sie einfach das 'bastleplate'-XML an die gewünschte Stelle.

Ich schlage vor, statt:

<xsl:template match="/"> 
    <catalog><xsl:apply-templates /></catalog> 
</xsl:template> 

<xsl:template match="cd"> 
    <cd><xsl:apply-templates /></cd> 
</xsl:template> 

<xsl:template match="artist"> 
    <artist><xsl:value-of select="text()" /></artist> 
</xsl:template> 

<xsl:template match="title"> 
    <title><xsl:value-of select="text()" /></title> 
</xsl:template> 

Ich kann mich nicht erinnern, ob Text() das Richtige ist, aber das könnte man in die richtige Richtung geht.

+0

+1 Ja, ich denke, das das aktuelle Knoten Konzept auf eine hilfreiche Weise – PandaWood

+0

Built-in der Regel für Text erklärt Knoten Ausgabe der Zeichenfolge Wert. Also sind alle Ihre Regeln die gleiche Regel ''. Sie müssen jedoch die Abisolierregeln hinzufügen, da die integrierte Regel für Elemente (in diesem Fall "cd" chlidren andere als "title" oder "artist") Vorlagen auf untergeordnete Elemente anwenden. –

1

Eigentlich hätte ich nicht gedacht, dass Sie all diese Vorlage passend brauchen würden. Es scheint es schwieriger zu machen, weil der Kontext jedes Mal anders ist.

Ich würde nur auf der Wurzel übereinstimmen, und tun Sie eine für jedes auf dem CD-Element. Scheint so viel einfacher, ich glaube, Sie nur verstehen, werden aus der Lektüre

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

    <xsl:template match="/"> 
     <catalog> 
      <xsl:for-each select="catalog/cd"> 
       <cd> 
        <title><xsl:value-of select="title"/></title> 
        <artist><xsl:value-of select="artist"/></artist> 
       </cd> 
      </xsl:for-each> 
     </catalog> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Und wenn wir diesen Pfad gehen, könnten Sie einfach '' –

1

Einen anderen Ansatz ;-), die Nutzung der Identitätsmuster verwandeln.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="country | company | price | year | processing-instruction()"/> 

</xsl:stylesheet> 

auf die Probe XML Angewandt wird die korrekte Ergebnis geführt:

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
    </cd> 
</catalog> 
+0

+1 für die beste Antwort. –

+0

Aber Sie müssen PIs nicht entfernen - es sind keine vorhanden. Wenn du das tust, solltest du wahrscheinlich auch Kommentarknoten entfernen? –

+0

@Dimitre, es gibt xml-stylesheet type = "text/xsl" href = "input.xsl". – Flack

Verwandte Themen