2009-06-11 14 views
0

Bitte meinen Code überprüfen und gib mir deine Ratschläge dazu:Problem mit XSL 1.0 <xsl: for-each> und <call-template>

XML-Datei: content.xml:

<content> 
<page id="page-1"> 
<!-- ... --> 
<block-center> 
    <block-center-row id="block-center-row-1"> 
    <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> 
    </block-center-row> 
    <block-center-row id="block-center-row-2"> 
    <block-center-colunm id="block-center-2-1"> 
     <book> 
     <title>Book Title1</title> 
     <author>Book Author1</author> 
     </book> 
     <book> 
     <title>Book Title2</title> 
     <author>Book Author2</author> 
     </book> 
     <book> 
     <title>Book Title3</title> 
     <author>Book Author3</author> 
     </book> 
    </block-center-colunm> 
    <block-center-colunm id="block-center-2-2"> 
     <seminar> 
     <author>Seminar author1</author> 
     <durable>3</durable> 
     </seminar> 
     <seminar> 
     <author>Seminar author2</author> 
     <durable>1.5</durable> 
     </seminar> 
     <seminar> 
     <author>Seminar author3</author> 
     <durable>2</durable> 
     </seminar> 
     <seminar> 
     <author>Seminar author4</author> 
     <durable>3</durable> 
     </seminar> 
    </block-center-colunm> 
    </block-center-row> 
</block-center> 
</page> 
<!-- ... --> 
</content> 

XSL-Datei : block-center-1-1.xsl:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template name="block-center-row-1"> 
    <div class="block-center-row"> 
     <h2>My CD Collection</h2> 
     <table border="1" width="100%"> 
     <tr bgcolor="#9acd32"> 
      <th>Title</th> 
      <th>Artist</th> 
     </tr> 
     <xsl:for-each select=" 
      content/page[@id=$pageId]/block-center/ 
      block-center-row[@id='block-center-row-1']/cd 
     "> 
      <tr> 
      <td> 
       <xsl:value-of select="title" /> 
      </td> 
      <xsl:choose> 
       <xsl:when test="price &gt; 10"> 
       <td bgcolor="#ff00ff"> 
        <xsl:value-of select="artist" /> 
       </td> 
       </xsl:when> 
       <xsl:when test="price &gt; 9"> 
       <td bgcolor="#cccccc"> 
        <xsl:value-of select="artist" /> 
       </td> 
       </xsl:when> 
       <xsl:otherwise> 
       <td> 
        <xsl:value-of select="artist" /> 
       </td> 
       </xsl:otherwise> 
      </xsl:choose> 
      </tr> 
     </xsl:for-each> 
     </table> 
    </div> 
    </xsl:template> 
</xsl:stylesheet> 

XSL-Datei block-center.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:import href="block-center-1-1.xsl" /> 
    <xsl:template name="block-center"> 
    <!-- if put here. It work properly --> 
    <div class="block-center"> 
     <xsl:for-each select="content/page[@id=$pageId]/block-center/block-center-row"> 
     <xsl:choose> 
      <!-- // I does not work here --> 
      <xsl:when test="@id='block-center-row-1'"> 
      <xsl:call-template name="block-center-row-1" /> 
      </xsl:when> 
     </xsl:choose> 
     </xsl:for-each> 
    </div> 
    </xsl:template> 
</xsl:stylesheet> 

Ich weiß nicht, warum es nicht funktioniert (out out put Daten), wenn ich <xsl:call-template> innerhalb <xsl:for-each> Schleife aufrufen. Ansonsten ist es in Ordnung.

+0

Von dem, was Sie uns dies gegeben haben wird nie funktionieren - es gibt keine passende Vorlage überhaupt. Sie müssen einen umfassenderen Code bereitstellen. – annakata

+0

Merkwürdig ... es sagt "6 Revisionen" hier unten rechts, aber in Wirklichkeit sind es nur 3 Revisionen. – Tomalak

Antwort

2

Ich habe ein paar Bemerkungen zu machen. Zunächst einmal ist es eine schlechte Idee, Format-Implikationen in XML zu machen. Elemente zu haben, die <block-center> oder <block-center-colunm> genannt werden, ist nicht nur unnötig ausführlich, es wird auch Ihren Kopf verletzen, sobald ihr Inhalt nicht mehr in einem Block in der Mitte angezeigt wird.

Zweitens, loslassen <xsl:call-template> und <xsl:for-each>. Sie mögen praktisch erscheinen, wenn Sie prozeduralen Programmierhintergrund haben, aber sie sind die falsche Wahl. Verwenden Sie stattdessen <xsl:apply-templates>, es führt zu Code, der sauberer und einfacher zu verstehen ist.

Jetzt zu Ihrem XSL. Dein zweites XSL (block-center.xsl) - was macht es? Warum haben Sie zwei separate XSL-Dateien? Außerdem fehlt eine Variablen- oder Parameterdeklaration. Ich habe verwendet:

<xsl:variable name="pageId" select="'page-1'" /> 

für meine Tests. Es hat auch nur eine Vorlage (<xsl:template name="block-center">), die nie wirklich aufgerufen wird, also hat es nichts für mich getan. Ich habe hinzugefügt

<xsl:template match="/"> 
    <xsl:call-template name="block-center" /> 
</xsl:template> 

so würde es zumindest alles tun.

Ihre andere XSL-Datei (block-center-1-1.xsl) hat eine for-each-Schleife, die nicht auf den richtigen Kontext schaut. Sie sind bereits in folgendem Zusammenhang, wenn Sie die Vorlage "block-center-row-1 „eingeben:

content/page[@id=$pageId]/block-center/block-center-row 

so alles, was Sie in der foreach-Schleife tun müssen, ist:

<xsl:for-each select="cd"> 

und es wird alles zur Ausgabe starten . <cd> Knoten

+0

Sie haben mich dazu geschlagen. :-) Ich schrieb immer noch meine Antwort, als du deine gepostet hast ... –

0

Vielleicht ändern:

<xsl:for-each select="content/page[@id=$PageId]/block-center/block-center-row"> 

in

Ich denke, es kann den Inhaltsknoten nicht finden, da es die Vorlage von innerhalb eines anderen Knotens aufruft.

0

Vielen Dank für Ihre Euthusiasm! Es funktioniert jetzt richtig, wenn ich in Block-Center-1-1 ändere.xsl Datei TO

OR