XSLT создает отдельные таблицы для каждой строки. Как мне сделать их в 1 таблицу? - PullRequest
0 голосов
/ 14 июня 2019

Я совершенно новичок в xml и xslt, поэтому, прежде всего, прошу прощения, если это чрезвычайно простой вопрос или на него ответили в другом месте, но я не понял его, так как еще не разбираюсь в синтаксисе.

Я пытаюсь создать таблицу, которая извлекает названия 4 домов из базы данных SQL и отображает их в таблице.К сожалению, мой код создает новую таблицу для каждого дома.Как я могу поместить их все в один и тот же стол?

Я поиграл с порядком, но, поскольку я совершенно новый, я не уверен, какая строка кода может помочь.Я собрал это вместе с несколькими другими примерами.

XSL:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<view>
 <name> Junior School Houses</name>
 <template type="xsl">
  <xsl>
   <xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://www.w3.org/1999/xhtml">
    <xsl:template match="row">
        <STYLE>
         H2 {font-family: calibri;}
     P {font-family:calibri;}
     table {border = 0;
     width:100%;}
     TD, TH {font-family: calibri;
      width: 33%;
      text-align: left;}
    </STYLE>
     <h2>Junior School Houses</h2>
      <table border="1">
       <tr bgcolor="#c8c8c8">
        <th> &#160; Academic House &#160; </th>
       </tr>
       <tr>
        <td> <xsl:value-of select="cell[@name='txtAcademicHouse']" /> 
            </td>
       </tr>
      </table>
    </xsl:template>
    </xsl:stylesheet>
  </xsl>
 </template>
</view>

XML

<source name="Junior School Houses" friendlyName="Junior School - Houses">
<connectionString>database=iSams;server=#####;user 
id=#####;pwd=########;Max Pool Size=100;Connection 
Lifetime=0</connectionString>
    <queryString>
        <![CDATA[
        --All House Points this week
        SELECT txtAcademicHouse
        FROM TblPupilManagementPupils
    ]]>
    </queryString>
<readGroup>SPECIAL:EVERYBODY </readGroup>
<publishGroup>##########################</publishGroup>
</source>

В настоящее время он отображает заголовок «Дома младшей школы», затемТаблица 2 на 1 с «Академическим домом» вверху, а затем первым домом внизу.

Этот же заголовок и комбинация 2by1 таблицы повторяются еще 3 раза с 3 другими домами, перечисленными в нижней ячейке соответствующегостолы.Мне нужен один заголовок, затем таблица 5 на 1 с «Академическим домом» вверху и четырьмя домами, перечисленными внизу.

Спасибо.

1 Ответ

2 голосов
/ 14 июня 2019

Ваш XSLT немного сбивает с толку, потому что xsl:stylesheet действительно должен быть элементом верхнего уровня, поэтому я предполагаю, что вы используете какое-то приложение / каркас, который обрабатывает выполнение SQL и передает результаты в виде XML в XSLT.

Но если предположить, что XML, получаемый из SQL, выглядит примерно так ...

<data>
<row>
    <cell name="txtAcademicHouse">House 1</cell>
</row>
<row>
    <cell name="txtAcademicHouse">House 2</cell>
</row>
</data>

Тогда в вашем XSLT происходит то, что ваш шаблон применяется один раз для каждого row и поскольку строк несколько, вы генерируете несколько отдельных таблиц.

У вас должно быть два шаблона.Один шаблон, соответствующий узлу документа, для построения одной таблицы, а затем другой, соответствующий row, для вывода только строк таблицы.Как то так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   xmlns="http://www.w3.org/1999/xhtml">

  <xsl:template match="/">
    <STYLE>
         H2 {font-family: calibri;}
     P {font-family:calibri;}
     table {border = 0;
     width:100%;}
     TD, TH {font-family: calibri;
      width: 33%;
      text-align: left;}
    </STYLE>
    <h2>Junior School Houses</h2>
    <table border="1">
      <tr bgcolor="#c8c8c8">
      <th> &#160; Academic House &#160; </th>
      </tr>
      <xsl:apply-templates select="//row" />
    </table>
  </xsl:template>

  <xsl:template match="row">
    <tr>
      <td>
        <xsl:value-of select="cell[@name='txtAcademicHouse']" /> 
      </td>
    </tr>
  </xsl:template>    
</xsl:stylesheet>
...