Как сделать так, чтобы в каждой строке отображалось 5 ячеек при использовании apply-templates - PullRequest
0 голосов
/ 11 ноября 2018

Это работа в процессе .... У меня есть этот файл CSS:

body
{
    font-family:'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
    font-size: 12pt;
}

table td {
    height: 14pt;
    border: 1px solid black;
    padding: 1mm;
}

.ElderText
{
    text-align:center;
}

.CalendarTable
{
    width:100%;
    border-collapse:collapse;
    border: 1px solid black;
}

.LableText
{
    font-weight: 700;
}

.MonthText
{

}

.PublisherText
{

}

.DateText
{
    font-size: 8pt;
}

.DateText td
{
    vertical-align: top;
}

И этот XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ElderlyInfirm-Schedule-v1.xsl"?>
<ScheduleData Version="1">
    <Labels>
        <Month>Month</Month>
        <Name>Name</Name>
        <Week1>Week 1</Week1>
        <Week2>Week 2</Week2>
        <Week3>Week 3</Week3>
        <Week4>Week 4</Week4>
        <Week5>Week 5</Week5>
    </Labels>
    <Elder Name="1">
        <Calendars>
            <Calendar Month="November">
                <Publishers>
                    <Publisher Name="a">
                        <Weeks>
                            <Week Day="5"/>
                            <Week Day="12"/>
                            <Week Day="19"/>
                            <Week Day="26"/>
                        </Weeks>
                    </Publisher>
                </Publishers>
            </Calendar>
            <Calendar Month="December">
                <Publishers>
                    <Publisher Name="a2">
                        <Weeks>
                            <Week Day="3"/>
                            <Week Day="10"/>
                            <Week Day="17"/>
                            <Week Day="24"/>
                            <Week Day="31"/>
                        </Weeks>
                    </Publisher>
                    <Publisher Name="a3">
                        <Weeks>
                            <Week Day="3"/>
                            <Week Day="10"/>
                            <Week Day="17"/>
                            <Week Day="24"/>
                            <Week Day="31"/>
                        </Weeks>
                    </Publisher>
                </Publishers>
            </Calendar>
        </Calendars>
    </Elder>
    <Elder Name="2">
        <Calendars>
            <Calendar Month="November">
                <Publishers>
                    <Publisher Name="b">
                        <Weeks>
                            <Week Day="5"/>
                            <Week Day="12"/>
                            <Week Day="19"/>
                            <Week Day="26"/>
                        </Weeks>
                    </Publisher>
                </Publishers>
            </Calendar>
        </Calendars>
    </Elder>
    <Elder Name="3">
        <Calendars>
            <Calendar Month="November">
                <Publishers>
                    <Publisher Name="c">
                        <Weeks>
                            <Week Day="5"/>
                            <Week Day="12"/>
                            <Week Day="19"/>
                            <Week Day="26"/>
                        </Weeks>
                    </Publisher>
                </Publishers>
            </Calendar>
        </Calendars>
    </Elder>
    <Elder Name="4">
        <Calendars>
            <Calendar Month="November">
                <Publishers>
                    <Publisher Name="d">
                        <Weeks>
                            <Week Day="5"/>
                            <Week Day="12"/>
                            <Week Day="19"/>
                            <Week Day="26"/>
                        </Weeks>
                    </Publisher>
                </Publishers>
            </Calendar>
        </Calendars>
    </Elder>
</ScheduleData>

И это XSL-преобразование:

<?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="html" indent="yes" version="4.01"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    doctype-public="//W3C//DTD XHTML 1.0 Transitional//EN"/>
  <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
        <link rel="stylesheet" type="text/css" href="ElderlyInfirm-Schedule-v1.css"/>
        <title>Report</title>
      </head>
      <body>
        <xsl:apply-templates select="ScheduleData/Elder"/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="Elder">
    <p class="ElderText">
      <xsl:value-of select="@Name"/>
    </p>
    <table class="CalendarTable">
      <xsl:apply-templates select="Calendars/Calendar"/>
    </table>
  </xsl:template>

  <xsl:template match="Calendar">
    <tr>
      <td class="LableText">
        <xsl:value-of select="/ScheduleData/Labels/Month"/>
      </td>
      <td class="LableText">
        <xsl:value-of select="/ScheduleData/Labels/Name"/>
      </td>
      <td class="LableText">
        <xsl:value-of select="/ScheduleData/Labels/Week1"/>
      </td>
      <td class="LableText">
        <xsl:value-of select="/ScheduleData/Labels/Week2"/>
      </td>
      <td class="LableText">
        <xsl:value-of select="/ScheduleData/Labels/Week3"/>
      </td>
      <td class="LableText">
        <xsl:value-of select="/ScheduleData/Labels/Week4"/>
      </td>
      <td class="LableText">
        <xsl:value-of select="/ScheduleData/Labels/Week5"/>
      </td>
    </tr>
    <xsl:apply-templates select="Publishers/Publisher"/>
  </xsl:template>

  <xsl:template match="Publisher">
    <tr>
      <td class="MonthText">
        <xsl:choose>
          <xsl:when test="position()=1">
            <xsl:value-of select="../../@Month"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text> </xsl:text>
          </xsl:otherwise>
        </xsl:choose>
      </td>
      <td class="PublisherText">
        <xsl:value-of select="@Name"/>
      </td>
      <xsl:apply-templates select="Weeks/Week"/>
    </tr>
  </xsl:template>

  <xsl:template match="Week">
    <td>
      <span class="DateText">
        <xsl:value-of select="@Day"/>
      </span>
      <br/>
      <br/>
    </td>
  </xsl:template>
</xsl:stylesheet>

Похоже:

Results Transformation

Как видите, у некоторых недель не будет 5 недель. Как настроить скрипт так, чтобы все 5 рисовались, даже если нет недели?

На этом этапе я могу при необходимости изменить синтаксис файла XML.

Я ищу самый простой подход.

1 Ответ

0 голосов
/ 12 ноября 2018

Это работает:

  <xsl:template match="Publisher">
    <tr>
      <td class="MonthText">
        <xsl:choose>
          <xsl:when test="position()=1">
            <xsl:value-of select="../../@Month"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text> </xsl:text>
          </xsl:otherwise>
        </xsl:choose>
      </td>
      <td class="PublisherText">
        <xsl:value-of select="@Name"/>
      </td>
      <xsl:apply-templates select="Weeks/Week"/>
      <xsl:choose>
        <xsl:when test="count(Weeks/Week)=3">
          <td>
            <xsl:text> </xsl:text>
          </td>
          <td>
            <xsl:text> </xsl:text>
          </td>
        </xsl:when>
        <xsl:when test="count(Weeks/Week)=4">
          <td>
            <xsl:text> </xsl:text>
          </td>
        </xsl:when>
      </xsl:choose>
    </tr>
  </xsl:template>

Я использовал функцию count.

...