Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何使用xsl创建包含空白单元格的表并将数据放置到正确的单元格中_Xml_Xslt - Fatal编程技术网

Xml 如何使用xsl创建包含空白单元格的表并将数据放置到正确的单元格中

Xml 如何使用xsl创建包含空白单元格的表并将数据放置到正确的单元格中,xml,xslt,Xml,Xslt,这是xml文件 我需要创造这样的东西 这是我创建的xsl 这就是我得到的 我无法将数据放在正确的日期下。 表的格式也不正确。 我是否在温度、img和总体代码之前开始?因为它们似乎在一列上对齐。我如何设计使这些信息在正确的日期出现 有一个xsl可以为您提供日期的周数,请参见: 如果您想将其包含到xslt中,并将xslt更改为如下内容: <?xml version="1.0" encoding="UTF-8" ?> <xsl:styleshe

这是xml文件

我需要创造这样的东西

这是我创建的xsl

这就是我得到的 我无法将数据放在正确的日期下。 表的格式也不正确。 我是否在温度、img和总体代码之前开始?因为它们似乎在一列上对齐。我如何设计使这些信息在正确的日期出现


有一个xsl可以为您提供日期的周数,请参见:

如果您想将其包含到xslt中,并将xslt更改为如下内容:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:date="http://exslt.org/dates-and-times"
  exclude-result-prefixes="date"
  >
  
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
  
  <xsl:include href="week-from-date.xsl"/>
  
  <xsl:template match="/forecast">
    <xsl:variable name="withWeekNumbers">
      <xsl:apply-templates mode="addWeekNumber"/>
    </xsl:variable>
    <xsl:variable name="sorted">
      <xsl:for-each select="$withWeekNumbers/weather">
        <xsl:sort select="@week"/>
        <xsl:sort select="@day"/>
        <xsl:variable name="currentWeek" select="@week"/>
        <xsl:if test="not( preceding-sibling::*[@week=$currentWeek])">
          <week week="{@week}">
            <xsl:copy-of select=".| following-sibling::*[@week=$currentWeek]"/>
          </week>
        </xsl:if>
      </xsl:for-each>
    </xsl:variable>
    <html>
      <head>
        <title>Singapore forecast</title>
      </head>
      <body>
        <h1>Singapore<xsl:value-of select="@queryTime"/></h1>
        <table border="1">
          <tr bgcolor="#FFA500">
            <th style="text-align:central"><b>Date</b></th>
            <th style="text-align:central"><b>Mon</b></th>
            <th style="text-align:central"><b>Tue</b></th>
            <th style="text-align:central"><b>Wed</b></th>
            <th style="text-align:central"><b>Thu</b></th>
            <th style="text-align:central"><b>Fri</b></th>
            <th style="text-align:central"><b>Sat</b></th>
            <th style="text-align:central"><b>Sun</b></th>
          </tr>
          <!-- first loop thrue available weeks -->
          <xsl:for-each select="$sorted/week">
            <xsl:variable name="week" select="."/>
            <tr>
              <td bgcolor="#FFA500">
                <xsl:value-of select="$week/@week"/>
              </td>
              <!-- Then loop thrue the days of the week -->
              <xsl:for-each select="$days/days/day">
                <xsl:variable name="day" select="."/>
                <!-- check if there is a weather element for this day. En if yes, use that. -->
                <xsl:variable name="dayWithForcast" select="$week/weather[@day=$day]"/>
                <td align="center">
                  <xsl:if test="$dayWithForcast">
                    <xsl:value-of select="$dayWithForcast/lowest"/>
                    <xsl:text>° - </xsl:text>
                    <xsl:value-of select="$dayWithForcast/highest"/>
                    <xsl:text>°</xsl:text>
                    <img>
                      <xsl:attribute name="src">
                        <xsl:text>image/</xsl:text>
                        <xsl:value-of select="$dayWithForcast/overallCode"/>
                        <xsl:text>.png</xsl:text>
                      </xsl:attribute>
                    </img>
                    <p>
                      <xsl:choose>
                        <xsl:when test="$dayWithForcast/overall='Considerable clouds'">
                          <span style="color:green">
                            <xsl:value-of select="$dayWithForcast/overall"/>
                          </span>
                        </xsl:when>
                        <xsl:when test="$dayWithForcast/overall='Partly sunny'">
                          <span style="color:red">
                            <xsl:value-of select="$dayWithForcast/overall"/>
                          </span>
                        </xsl:when>
                        <xsl:when test="$dayWithForcast/overall='Plenty of sunshine'">
                          <span style="color:red">
                            <xsl:value-of select="$dayWithForcast/overall"/>
                          </span>
                        </xsl:when>
                        <xsl:otherwise>
                          <span style="color:blue">
                            <xsl:value-of select="$dayWithForcast/overall"/>
                          </span>
                        </xsl:otherwise>
                      </xsl:choose>
                    </p>
                  </xsl:if>
                </td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
  
  <xsl:variable name="days">
    <days>
      <day name="Mon">1</day>
      <day name="Tue">2</day>
      <day name="Wed">3</day>
      <day name="Thu">4</day>
      <day name="Fri">5</day>
      <day name="Sat">6</day>
      <day name="Sun">7</day>
    </days>
  </xsl:variable>

  <xsl:template mode="addWeekNumber" match="weather">
    <!-- @day and @week attributes to be able to group them for your needs -->
    <xsl:copy>
      <xsl:variable name="dayNaam" select="dayOfWeek"/>
      <xsl:attribute name="day">
        <xsl:value-of select="$days/days/day[@name=$dayNaam]/text()"/>
      </xsl:attribute>
      <xsl:attribute name="week">
        <xsl:call-template name="date:week-in-year">
          <xsl:with-param name="date-time" select="concat(substring(@yyyymmdd,1,4),'-',substring(@yyyymmdd,5,2),'-',substring(@yyyymmdd,7,2),'T00:00:00Z')"/>
        </xsl:call-template>
      </xsl:attribute>
      <xsl:copy-of select="@*|*"/>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

显示日历有一个良好的开端。

您的XML文件包含连续5天的天气数据,从周四开始,到周一结束。如果要显示一个表示日历的表,其中每行是一周,每个单元格是一个日期,则必须首先构造这样的表,然后用XML中的数据填充与天气数据对应的单元格。如果您仅限于XSLT1.0,这将是一个相当大的挑战,从您的尝试中可以看出这一点——在更高的版本中也并非微不足道。如果这是家庭作业,我建议你找另一位老师。嗨,谢谢你,迈克尔,所以我没有办法编辑这个xsl来让它工作吗?当然有。但是你必须首先找到你有天气数据的最早日期;2计算该日期之前或当天的第一个星期一的日期;3创建一行7个单元格,其中包含该星期一所在周的日期;4对于每个单元格,计算其日期,如果源XML中有匹配的条目,则获取其数据;5继续创建下一行,直到星期一的日期大于您有天气数据的最新日期。每一个问题都应该有一个单独的问题。。。。。。这是假设您想要准确地获得跨越天气数据日期所需的行数。-顺便说一句,据我所知,不可能有一个像您在预期结果中显示的那样的日期列,因为一周可能有——并且在您的示例中确实有——多个预测日期。这有几个问题,其中一些问题是可以解决的,例如在XSLT 1.0处理器上运行时产生数据类型错误或在年份边界出现故障,还有一个问题是无法解决的,因为这是基于这样一种假设,即输入XML在所需的跨度内每周至少有一天有数据。@michael.hor257k:是关于如何处理这一问题的想法问题…不是一个完整的解决方案。还有很多问题需要解决。但我会说,总比什么都没有好-恐怕你没有领会我的意思:这个想法本身是有缺陷的,不会导致问题的解决——至少不是你和我所理解的问题,即输入在日期之间有间隔。@michael.hor257k:正确,我不理解这个问题。我想他需要连续一周和一周中的每一天。牢房。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
 <xsl:template match="/forecast">
  <html>
   <head>
    <title>Singapore forecast</title>
   </head>
   <body>
    <h1>Singapore<xsl:value-of select="@queryTime"/></h1>
    <table border="1">
      <tr bgcolor="#FFA500">
       <th style="text-align:central"><b>Date</b></th>
       <th style="text-align:central"><b>Mon</b></th>
       <th style="text-align:central"><b>Tue</b></th>
       <th style="text-align:central"><b>wed</b></th>
       <th style="text-align:central"><b>Thu</b></th>
       <th style="text-align:central"><b>Fri</b></th>
       <th style="text-align:central"><b>Sat</b></th>
       <th style="text-align:central"><b>Sun</b></th>
      </tr>
      <xsl:for-each select="weather">
        <xsl:sort select="date"/>
        <tr>
          <td bgcolor="#FFA500">
            <xsl:value-of select="year"/>
            <xsl:text>/</xsl:text>
            <xsl:value-of select="month"/>
            <xsl:text>/</xsl:text>
            <xsl:value-of select="date"/>
          </td>

          <td align="center">
            <xsl:value-of select="lowest"/>
            <xsl:text>° - </xsl:text>
            <xsl:value-of select="highest"/>
            <xsl:text>°</xsl:text>
            <img>
              <xsl:attribute name="src">
                <xsl:text>image/</xsl:text>
                <xsl:value-of select="overallCode"/>
                <xsl:text>.png</xsl:text>
              </xsl:attribute>
            </img>
            <p>
            <xsl:choose>
              <xsl:when test="overall='Considerable clouds'">
                <span style="color:green">
                  <xsl:value-of select="overall"/>
                </span>
              </xsl:when>
                <xsl:when test="overall='Partly sunny'">
                  <span style="color:red">
                    <xsl:value-of select="overall"/>
                  </span>
                </xsl:when>
                  <xsl:when test="overall='Plenty of sunshine'">
                    <span style="color:red">
                      <xsl:value-of select="overall"/>
                    </span>
                  </xsl:when>
                  <xsl:otherwise>
                    <span style="color:blue">
                      <xsl:value-of select="overall"/>
                    </span>
                  </xsl:otherwise>
            </xsl:choose>
          </p>
          </td>
        </tr>
      </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:date="http://exslt.org/dates-and-times"
  exclude-result-prefixes="date"
  >
  
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
  
  <xsl:include href="week-from-date.xsl"/>
  
  <xsl:template match="/forecast">
    <xsl:variable name="withWeekNumbers">
      <xsl:apply-templates mode="addWeekNumber"/>
    </xsl:variable>
    <xsl:variable name="sorted">
      <xsl:for-each select="$withWeekNumbers/weather">
        <xsl:sort select="@week"/>
        <xsl:sort select="@day"/>
        <xsl:variable name="currentWeek" select="@week"/>
        <xsl:if test="not( preceding-sibling::*[@week=$currentWeek])">
          <week week="{@week}">
            <xsl:copy-of select=".| following-sibling::*[@week=$currentWeek]"/>
          </week>
        </xsl:if>
      </xsl:for-each>
    </xsl:variable>
    <html>
      <head>
        <title>Singapore forecast</title>
      </head>
      <body>
        <h1>Singapore<xsl:value-of select="@queryTime"/></h1>
        <table border="1">
          <tr bgcolor="#FFA500">
            <th style="text-align:central"><b>Date</b></th>
            <th style="text-align:central"><b>Mon</b></th>
            <th style="text-align:central"><b>Tue</b></th>
            <th style="text-align:central"><b>Wed</b></th>
            <th style="text-align:central"><b>Thu</b></th>
            <th style="text-align:central"><b>Fri</b></th>
            <th style="text-align:central"><b>Sat</b></th>
            <th style="text-align:central"><b>Sun</b></th>
          </tr>
          <!-- first loop thrue available weeks -->
          <xsl:for-each select="$sorted/week">
            <xsl:variable name="week" select="."/>
            <tr>
              <td bgcolor="#FFA500">
                <xsl:value-of select="$week/@week"/>
              </td>
              <!-- Then loop thrue the days of the week -->
              <xsl:for-each select="$days/days/day">
                <xsl:variable name="day" select="."/>
                <!-- check if there is a weather element for this day. En if yes, use that. -->
                <xsl:variable name="dayWithForcast" select="$week/weather[@day=$day]"/>
                <td align="center">
                  <xsl:if test="$dayWithForcast">
                    <xsl:value-of select="$dayWithForcast/lowest"/>
                    <xsl:text>° - </xsl:text>
                    <xsl:value-of select="$dayWithForcast/highest"/>
                    <xsl:text>°</xsl:text>
                    <img>
                      <xsl:attribute name="src">
                        <xsl:text>image/</xsl:text>
                        <xsl:value-of select="$dayWithForcast/overallCode"/>
                        <xsl:text>.png</xsl:text>
                      </xsl:attribute>
                    </img>
                    <p>
                      <xsl:choose>
                        <xsl:when test="$dayWithForcast/overall='Considerable clouds'">
                          <span style="color:green">
                            <xsl:value-of select="$dayWithForcast/overall"/>
                          </span>
                        </xsl:when>
                        <xsl:when test="$dayWithForcast/overall='Partly sunny'">
                          <span style="color:red">
                            <xsl:value-of select="$dayWithForcast/overall"/>
                          </span>
                        </xsl:when>
                        <xsl:when test="$dayWithForcast/overall='Plenty of sunshine'">
                          <span style="color:red">
                            <xsl:value-of select="$dayWithForcast/overall"/>
                          </span>
                        </xsl:when>
                        <xsl:otherwise>
                          <span style="color:blue">
                            <xsl:value-of select="$dayWithForcast/overall"/>
                          </span>
                        </xsl:otherwise>
                      </xsl:choose>
                    </p>
                  </xsl:if>
                </td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
  
  <xsl:variable name="days">
    <days>
      <day name="Mon">1</day>
      <day name="Tue">2</day>
      <day name="Wed">3</day>
      <day name="Thu">4</day>
      <day name="Fri">5</day>
      <day name="Sat">6</day>
      <day name="Sun">7</day>
    </days>
  </xsl:variable>

  <xsl:template mode="addWeekNumber" match="weather">
    <!-- @day and @week attributes to be able to group them for your needs -->
    <xsl:copy>
      <xsl:variable name="dayNaam" select="dayOfWeek"/>
      <xsl:attribute name="day">
        <xsl:value-of select="$days/days/day[@name=$dayNaam]/text()"/>
      </xsl:attribute>
      <xsl:attribute name="week">
        <xsl:call-template name="date:week-in-year">
          <xsl:with-param name="date-time" select="concat(substring(@yyyymmdd,1,4),'-',substring(@yyyymmdd,5,2),'-',substring(@yyyymmdd,7,2),'T00:00:00Z')"/>
        </xsl:call-template>
      </xsl:attribute>
      <xsl:copy-of select="@*|*"/>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>