2016-07-23 11 views
-1

Ich habe eine XML-Datei, die den Wert einer Spalte enthält, muss ich als Parameter an meine xsl foreach-Anweisung übergeben. Im Folgenden finden Sie meine Implementierung, aber ich bin nicht das gewünschte Ergebnis zu erzielen:Zuweisen einer Variablen in XSL FO foreach Anweisung

XML

 <PdfPrinter> 
     <Reports> 
     <Report> 
     <CreatedDate>2015-10-07T18:07:45</CreatedDate> 
     <LogType>ChangePassword</LogType> 
     <LoginID>ADMIN</LoginID> 
     <Name>XYZ</Name> 
     <AppVersion></AppVersion> 
     <System>OS</System> 
     <UserIPAddress>192.168.1.83</UserIPAddress> 
     <LoginDate /> 
     <LogoutDate /> 
     <Remarks></Remarks> 
     </Report> 
     <Report> 
     <CreatedDate>2015-10-07T18:09:54</CreatedDate> 
     <LogType>ChangePassword</LogType> 
     <LoginID>SUPERADMIN</LoginID> 
     <Name>ABC</Name> 
     <AppVersion></AppVersion> 
     <System>OS</System> 
     <UserIPAddress>192.168.1.83</UserIPAddress> 
     <LoginDate /> 
     <LogoutDate /> 
     <Remarks></Remarks> 
     </Report> 
     <Header> 
     <ReportID>AUD002</ReportID> 
     <GroupingColumn1>LoginID</GroupingColumn1> 
     <PrintedBy>SOS</PrintedBy> 
     <PrintedDate>2016-07-22T11:53:59.8826074Z</PrintedDate> 
     </Header> 
     </Reports> 
     </PdfPrinter> 

XSLT

//variable declaration 
<xsl:key name="Report" match="Report" use="$GroupingColumn" /> 
<xsl:variable name="GroupingColumn"> 
<xsl:value-of select="/PdfPrinter/Reports/Header/GroupingColumn1" /> 
</xsl:variable> 

//Usage of the assigned variable 
<xsl:for-each select="/PdfPrinter/Reports/Report[1]/*[local-name() !='$GroupingColumn']"> 
    <fo:table-column column-width="proportional-column-width(4.77)"/> 
</xsl:for-each> 

Im XML, einen beliebigen Wert sollte I, die GroupingColumn1 kann Übergeben Sie es an meine XSL foreach.

**My XSL TABLE** 

    <fo:table border-bottom-width="5pt" 
    width="1200pt" border-bottom-color="rgb(0,51,102)"> 
    <!--table header--> 
     <xsl:for-each select="/PdfPrinter/Reports/Report[1]/*[local-name() != 'LoginID']"> 
    <fo:table-column column-width="proportional-column-width(4.77)"/> 
    </xsl:for-each> 
    <fo:table-header> 
    <fo:table-row height="20.81pt" display-align="center" overflow="hidden"> 
    <xsl:for-each select="/PdfPrinter/Reports/Report[1]/*[local-name() != 'LoginID']"> 
    <fo:table-cell text-align="center" border="rgb(0, 0, 0) solid 1pt" padding="2pt"> 
     <fo:block color="rgb(0,0,0)" text-align="center" font-weight="normal"> 
     <xsl:value-of select="name()"/> 
     </fo:block> 
    </fo:table-cell> 
    </xsl:for-each> 
    </fo:table-row> 
    </fo:table-header> 
    <!--table body--> 
    <fo:table-body> 
    <xsl:for-each 
    select="PdfPrinter/Reports/Report[generate-id() = generate-id(key('Report', LoginID)[1])]"> 
    <fo:table-row> 
     <fo:table-cell number-columns-spanned="{count(*) - 1}"> 
     <fo:block><xsl:apply-templates select="LoginID" /></fo:block> 
    </fo:table-cell> 
    </fo:table-row> 
    <xsl:for-each select="key('Report', LoginID)"> 
    <fo:table-row display-align="before"> 
     <xsl:for-each select="*[local-name() != 'LoginID']"> 
     <fo:table-cell text-align="center" 
     border-top-color="rgb(0, 0, 0)" 
     border-top-style="solid" border-width="1pt" padding="2pt"> 
      <fo:block> 
      <xsl:value-of select="."/> 
      </fo:block> 
     </fo:table-cell> 
     </xsl:for-each> 
     </fo:table-row> 
     </xsl:for-each> 
     </xsl:for-each> 
     </fo:table-body> 
     </fo:table> 

In der obigen Tabelle habe ich die Spaltennamen als LoginID fest einprogrammiert, statt dass ich mag die Variablennamen übergeben und die Tabelle zu erstellen. Ich kann die GroupingColumn-Variable drucken, weiß aber nicht, warum die Ausgabe nicht gedruckt wird.

+0

Sie XSL macht keinen Sinn, gegen Ihre Eingabe XML. Versuchen Sie nicht, es zu schnippen und zu denken, dass wir es verstehen können. Beispiel: Ihr XSL hat einen Xpath "/ PdfPrinter/Reports/Header/GroupingColumn1", der nirgendwo in Ihrem XML existiert, so dass es nichts zurückgeben würde. Es gibt keine Möglichkeit zu diagnostizieren Ihr Problem mit konkurrierenden Informationen. –

+0

@KevinBrown: Ich bin Level-1-Gruppierung basierend auf dem GroupingColumn1-Wert in der XML implementiert, ich sollte in der Lage sein, den GroupingColumn1-Wert an meine XSL übergeben, wie im obigen Snippet gezeigt. Ich denke, das ist nur eine variable Zuweisung, falls erforderlich werde ich die volle XSLT posten. Bitte beraten. Vielen Dank. –

+0

Jede Hilfe wird sehr geschätzt .. –

Antwort

0

Die andere von mir angegebene Antwort funktioniert nur in XSLT 2.0, wie in XSLT 1.0 "Es ist ein Fehler für den Wert des Attributs use oder des Attributs match, das eine Variablenreferenz enthält". (Siehe http://www.w3.org/TR/xslt#key)

Es ist möglich, in XSLT 1.0, aber es wird nicht sehr effizient sein, aber versuchen, dieses XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="yes" /> 

<xsl:variable name="GroupingColumn" select="/PdfPrinter/Reports/Header/GroupingColumn1" /> 

<xsl:template match="/PdfPrinter"> 
    <table> 
     <header> 
      <row> 
       <cell> 
        <xsl:value-of select="$GroupingColumn" /> 
       </cell> 
       <xsl:for-each select="Reports/Report[1]/*[local-name() != $GroupingColumn]"> 
        <cell> 
         <xsl:value-of select="local-name()" /> 
        </cell> 
       </xsl:for-each> 
      </row> 
     </header> 
     <body> 
      <xsl:variable name="distinct" select="Reports/Report[not(*[local-name() = $GroupingColumn] = preceding-sibling::Report/*[local-name() = $GroupingColumn])]" /> 
      <xsl:for-each select="$distinct"> 
       <xsl:variable name="current-grouping-key" select="*[local-name() = $GroupingColumn]" /> 
       <xsl:variable name="current-group" select="../Report[*[local-name() = $GroupingColumn] = $current-grouping-key]" /> 
       <xsl:for-each select="$current-group"> 
       <row> 
        <xsl:if test="position() = 1"> 
         <cell rowspan="{count($current-group)}"><xsl:value-of select="$current-grouping-key" /></cell> 
        </xsl:if> 
        <xsl:for-each select="*[local-name() != $GroupingColumn]"> 
        <cell> 
         <xsl:value-of select="." /> 
        </cell> 
        </xsl:for-each> 
       </row> 
       </xsl:for-each> 
      </xsl:for-each> 
     </body> 
    </table> 
</xsl:template> 
</xsl:stylesheet> 
+0

Vielen Dank .. leicht verändert den Code und die gewünschte Ausgabe ist gekommen .. Vielen Dank für Ihre Hilfe .. –

+0

Meine aufrichtige Entschuldigung, das obige XSLT funktioniert perfekt. Getestet und modifiziert nach meinen Anforderungen. Vielen Dank.. –