Announcement

Collapse
No announcement yet.

XMl Attribute mit XSLT formatieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XMl Attribute mit XSLT formatieren

    Hallo, ich bin noch neu in XML und XSLT und versuche gerade folgendes:

    Code:
    <?xml version="1.0"?>
    <View DisplayName="Name">
    <ViewFields>
    
    <FieldRef Name="Deal_x0020_Status" />
    <FieldRef Name="Product_x0020_or_x0020_Service" />
    <FieldRef Name="Country" />
    <FieldRef Name="Business_x0020_Unit" />
    
    </ViewFields></View>
    mein XSLT Code dazu:

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!-- Edited by XMLSpy® -->
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
      <html>
      <body>
      <h2>Columns</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th><xsl:value-of select="View/@DisplayName"/></th>
          </tr>
          <xsl:for-each select="View/ViewFields">
          <tr>
            <td><xsl:value-of select="FieldRef/@Name"/></td>
          </tr>
          </xsl:for-each>
        </table>
      </body>
      </html>
    </xsl:template>
    </xsl:stylesheet>

    Ich will eine Tabelle erstellen mit 1 Spalte. In der Tabelle sollen alle Werte vom Attribute "Name" aufgelistet werden.
    Mit meinem Code erreiche ich aber nur einen Tabellenkopf und 1 Zelle mit "Deal_x0020_Status"

    kann mir vllt jmd weiterhelfen?
    Danke schon mal!!

  • #2
    Statt 'for-each select="View/ViewFields"' nimm 'for-each select="View/ViewFields/FieldRef/@Name"', dann beim 'value-of' einfach 'value-of select="."'.

    Die Benutzung von for-each nennt man auch "pull style processing". Komplexere Aufgaben lassen sich in XSLT aber mittels "push style processing" (mehre Templates und Aufrufen dieser durch apply-templates) besser und strukturierter lösen, etwa
    Code:
    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0">
    
    <xsl:template match="/">
      <html>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
    </xsl:template>
    
    <xsl:template match="View">
      <h2>Columns</h2>
      <table>
         <thead>
            <tr>
               <th><xsl:value-of select="@DisplayName"/></th>
            </tr>
         </thead>
         <xsl:apply-templates/>
      </table>
    </xsl:template>
    
    <xsl:template match="ViewFields">
      <tbody>
         <xsl:apply-templates/>
      </tbody>
    </xsl:template>
    
    <xsl:template match="FieldRef">
      <tr>
         <xsl:apply-templates select="@*"/>
      </tr>
    </xsl:template>
    
    <xsl:template match="FieldRef/@*">
      <td>
         <xsl:value-of select="."/>
      </td>
    </xsl:template>
    
    </xsl:stylesheet>

    Comment


    • #3
      Danke Martin, es funktioniert !
      Und danke für den Tipp mit dem push style processing

      Comment


      • #4
        Ich habe noch eine Frage:

        Ich will zur Darstellung keinen HTML Code mehr verwenden, sondern nur einen reinen XML Code.

        dafür hab folgenden xsl code verwendet
        Code:
        <?xml version="1.0" encoding="ISO-8859-1"?><!-- Edited by XMLSpy® -->
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="/"><view><xsl:element name="viewname">
        <xsl:value-of select="View/@DisplayName"/></xsl:element>
        <xsl:for-each select="View/ViewFields/FieldRef/@Name">
        <xsl:element name="FieldColumns"><xsl:value-of select="."/>
        </xsl:element></xsl:for-each>
        </view></xsl:template></xsl:stylesheet>
        Wie kann es so schreiben, dass der @DisplayName gleich der Spaltenname wird? Bzw. dass ich den Elementnamen "FieldColumns" mit @DisplayName ersetze? ICh habe schon verschiedenes, u.a. mit {} probiert, aber es scheint nicht zu funktionieren.. wäre für jede Hilfe dankbar!! Vllt kann mir jmd auch zeigen, wie es beim push style processing funktioniert`?

        Comment


        • #5
          Die Syntax fuer sogenannte "attribute value templates" ist
          Code:
          <xsl:element name="{XPath-Ausdruck-hier}">...</xsl:element>
          also suchst du vermutlich etwas wie
          Code:
          <xsl:element name="{/View/@DisplayName}">...</xsl:element>

          Comment


          • #6
            Uff. Hatte einen / vergessen... danke !

            Comment

            Working...
            X