2016-08-09 5 views
0

私はxmlファイルを持っているが、以下のように見えると私は特定の(私の例では2017年1月1日)からレートを取得したいと思います。しかし問題は、それらのうちのいくつかは複数のレートを持っており、それらはすべて水平に出てくるべきです。フォーマットに問題はなく、xsl:stylesheet version="1.0"に基づいてRate1を取得できます。しかし、私はどのようにRate2とRate3を取得するのですか?助けてくださいここに例があります。ここでXML - 特定のノードと出力から選択するためのXSL水平

は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> 

はXSLです:

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

だから1つがテーブルのうち5つのレートが与えられた日付の場合、出力に5 * RateN *カラムが必要ですか? –

+0

ありがとうございます。料金の最大列は3倍以上になります。私は彼らが将来その要件を増やさないことを願っています。 – ian0411

答えて

1

率の最大列になります。ここでは

<!--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> 

が期待される結果があります3以上ではない

まあ、それはかなり単純なことができます:

XSLT 1.0

これは以下のような 整形 XML入力に適用される
<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> 

(!)

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> 

結果は次のようになります。

としてレンダリング
<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> 

: "それらのいくつかは、複数の速度を持っており、それらはすべて水平に出てくるべきである*。*"

enter image description here

+0

うわー、これはすばらしく、魅力的に機能しました。 がここのキーです。それは理解するために私をしばらくかかったが、それは非常にきちんとしており、明らかである。本当にありがとう、マイケル、私はあなたの時間と迅速な助けを本当に感謝しています。 – ian0411

+0

ちょうどしました。助けてくれてありがとう、マイケル。 – ian0411

関連する問題