2016-08-09 250 views
0

Ich habe eine XML-Datei wie unten aussieht und ich würde die Rate von einem bestimmten Datum (2017.01.01 in meinem Beispiel) zu bekommen. Aber das Problem ist, einige von ihnen haben mehrere Raten und sie sollten alle horizontal herauskommen. Das Format hat kein Problem und ich kann die Rate1 basierend auf xsl:stylesheet version="1.0" erhalten. Aber wie bekomme ich die Rate2 und Rate3? Bitte helfen Sie und hier ist das Beispiel. HierXML - XSL zur Auswahl bestimmter Knoten und Ausgang horizontal

ist die xml:

<Table> 
    <TableName>Table A</TableName> 
    <Details> 
     <Date>2016-01-01</Date> 
     <Rate>0.01</Rate> 
    </Details> 
    <Details> 
     <Date>2017-01-01</Date> 
     <Rate>0.01</Rate> 
    </Details> 
</Table> 
<Table> 
    <TableName>Table B</TableName> 
    <Details> 
     <Date>2016-01-01</Date> 
     <Rate>0.02</Rate> 
    </Details> 
    <Details> 
     <Date>2017-01-01</Date> 
     <Rate>0.02</Rate> 
    </Details> 
</Table> 
<Table> 
    <TableName>Table C</TableName> 
    <Details> 
     <Date>2016-01-01</Date> 
     <Rate>0.03</Rate> 
    </Details> 
    <Details> 
     <Date>2016-01-01</Date> 
     <Rate>0.04</Rate> 
    </Details> 
    <Details> 
     <Date>2016-01-01</Date> 
     <Rate>0.05</Rate> 
    </Details> 
    <Details> 
     <Date>2017-01-01</Date> 
     <Rate>0.03</Rate> 
    </Details> 
    <Details> 
     <Date>2017-01-01</Date> 
     <Rate>0.04</Rate> 
    </Details> 
    <Details> 
     <Date>2017-01-01</Date> 
     <Rate>0.05</Rate> 
    </Details> 
</Table> 

Hier wird die XSL ist:

<!--I have a variable defined $Date20170101 to get 2017-01-01--> 
<xsl:if test="Details/Date = $Date20170101"> 
    <tr> 
     <th> 
      <xsl:value-of select="TableName"/> 
     </th> 
     <td> 
      <!--"format-date" is to format the date to mm/dd/yyyy--> 
      <xsl:call-template name="format-date"> 
       <xsl:with-param name="date"> 
        <xsl:value-of select="Details/Date"/> 
       </xsl:with-param> 
      </xsl:call-template> 
     </td> 
     <!--Below is the problem I have--> 
     <xsl:if test="(Details/Rate)[1]"> 
      <td> 
       <xsl:value-of select="(Details/Rate)[1]"/> 
      </td> 
     </xsl:if> 
     <xsl:if test="(Details/Rate)[2]"> 
      <td> 
       <xsl:value-of select="(Details/Rate)[2]"/> 
      </td> 
     </xsl:if> 
     <xsl:if test="(Details/Rate)[3]"> 
      <td> 
       <xsl:value-of select="(Details/Rate)[2]"/> 
      </td> 
     </xsl:if> 
    </tr> 
</xsl:if> 

Hier ist die erwarteten Ergebnisse:

Table Name   Date  Rate1  Rate2  Rate3 
Table A    1/1/2017 0.01  N/A   N/A 
Table B    1/1/2017 0.02  N/A   N/A 
Table C    1/1/2017 0.03  0.04  0.05 
+0

Also, wenn man der Tabellen hat 5 Preise für die angegebenen Daten, möchten Sie die Ausgabe 5 * RateN * Spalten haben? –

+0

Vielen Dank für Ihre Hilfe. Die maximalen Spalten der Preise werden 3 und nicht mehr sein. Ich hoffe, dass sie diese Anforderung in Zukunft nicht erhöhen. – ian0411

Antwort

1

Die maximalen Spalten von Raten werden 3 und nicht mehr

Nun, dann kann es ziemlich einfach sein:

XSLT 1,0

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

<xsl:param name="given-date">2017-01-01</xsl:param> 

<xsl:template match="/root"> 
    <table border="1"> 
     <tr> 
      <th>Table Name</th> 
      <th>Date</th> 
      <th>Rate1</th> 
      <th>Rate2</th> 
      <th>Rate3</th> 
     </tr> 
     <xsl:for-each select="Table"> 
      <tr> 
       <td> 
        <xsl:value-of select="TableName"/> 
       </td> 
       <td> 
        <xsl:value-of select="$given-date"/> 
       </td> 
       <xsl:variable name="details" select="Details[Date=$given-date]" /> 
       <td> 
        <xsl:value-of select="$details[1]/Rate"/> 
       </td> 
       <td> 
        <xsl:value-of select="$details[2]/Rate"/> 
       </td> 
       <td> 
        <xsl:value-of select="$details[3]/Rate"/> 
       </td> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

Wenn hier ein angewendet wird wohlgeformte XML-Eingabe wie (!):

XML

<root> 
    <Table> 
     <TableName>Table A</TableName> 
     <Details> 
      <Date>2016-01-01</Date> 
      <Rate>0.01</Rate> 
     </Details> 
     <Details> 
      <Date>2017-01-01</Date> 
      <Rate>0.01</Rate> 
     </Details> 
    </Table> 
    <Table> 
     <TableName>Table B</TableName> 
     <Details> 
      <Date>2016-01-01</Date> 
      <Rate>0.02</Rate> 
     </Details> 
     <Details> 
      <Date>2017-01-01</Date> 
      <Rate>0.02</Rate> 
     </Details> 
    </Table> 
    <Table> 
     <TableName>Table C</TableName> 
     <Details> 
      <Date>2016-01-01</Date> 
      <Rate>0.03</Rate> 
     </Details> 
     <Details> 
      <Date>2016-01-01</Date> 
      <Rate>0.04</Rate> 
     </Details> 
     <Details> 
      <Date>2016-01-01</Date> 
      <Rate>0.05</Rate> 
     </Details> 
     <Details> 
      <Date>2017-01-01</Date> 
      <Rate>0.03</Rate> 
     </Details> 
     <Details> 
      <Date>2017-01-01</Date> 
      <Rate>0.04</Rate> 
     </Details> 
     <Details> 
      <Date>2017-01-01</Date> 
      <Rate>0.05</Rate> 
     </Details> 
    </Table> 
</root> 

das Ergebnis wird:

<table border="1"> 
    <tr> 
     <th>Table Name</th> 
     <th>Date</th> 
     <th>Rate1</th> 
     <th>Rate2</th> 
     <th>Rate3</th> 
    </tr> 
    <tr> 
     <td>Table A</td> 
     <td>2017-01-01</td> 
     <td>0.01</td> 
     <td/> 
     <td/> 
    </tr> 
    <tr> 
     <td>Table B</td> 
     <td>2017-01-01</td> 
     <td>0.02</td> 
     <td/> 
     <td/> 
    </tr> 
    <tr> 
     <td>Table C</td> 
     <td>2017-01-01</td> 
     <td>0.03</td> 
     <td>0.04</td> 
     <td>0.05</td> 
    </tr> 
</table> 

gemacht wie: "* einige von ihnen mehrere Preise haben und sie sollten alle horizontal herauskommen sein *"

enter image description here

+0

Wow, das ist großartig und es hat wie ein Charme funktioniert. Die ist hier der Schlüssel. Das hat eine Weile gedauert, bis ich es verstanden habe, aber es ist sehr ordentlich und klar. Vielen Dank, Michael, ich habe deine Zeit und schnelle Hilfe sehr geschätzt. – ian0411

+0

Habe gerade getan. Danke nochmal für die Hilfe, Michael. – ian0411