Проблемы с выравниванием данных в XSLT с вложенными таблицами

Вы правы - вы объявили новый тип использования (Name_pairs), и вам нужна переменная этого типа, чтобы использовать его.

Код должен выглядеть следующим образом:

Name_pairs np;
np.read_names()
2
задан Michael 14 July 2018 в 00:37
поделиться

2 ответа

При первом вызове данных измените на

<xsl:choose>
  <xsl:when test="position()=1">
    <w:t><xsl:value-of select="data"/></w:t>
  </xsl:when>
  <xsl:otherwise>
    <w:t><xsl:value-of select="following::row[$imageid - 2]/data"/></w:t>
  </xsl:otherwise>
</xsl:choose>

Затем, во время второго вызова, используйте

    <w:t><xsl:value-of select="following::row[$imageid - 1]/data"/></w:t>

. Это должно выровнять данные так, как вы хотите .

1
ответ дан MAM 17 August 2018 в 12:20
поделиться

Если целью является сопоставление последовательности элементов row (т.е. строки 1, 2, 3, 4, 5) с таблицей с двумя столбцами, в которой каждая ячейка таблицы содержит данные строки aa, а макет -

<table>
  <row><cell>1</cell><cell>2</cell></row>
  <row><cell>3</cell><cell>4</cell></row>
  <row><cell>5</cell></row>
</table>

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

Ниже приведен пример использования HTML-таблиц в качестве целевого формата:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
    xmlns:msxml="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="exsl msxml"
    version="1.0">

  <xsl:output method="html" indent="yes" version="5" doctype-system="about:legacy-doctype"/>


  <xsl:template match="/">
    <html>
      <head>
        <title>.NET XSLT Fiddle Example</title>
      </head>
      <body>
          <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="root">
      <table>
          <thead>
              <tr>
                  <th>col 1</th>
                  <th>col 2</th>
              </tr>
          </thead>
          <tbody>
              <xsl:apply-templates select="row[position() mod 2 = 1]" mode="row"/>
          </tbody>
      </table>
  </xsl:template>

  <xsl:template match="row" mode="row">
      <tr>
          <xsl:apply-templates select=". | following-sibling::row[1]" mode="cell"/>
      </tr>
  </xsl:template>

  <xsl:template match="row" mode="cell">
      <td>
          <xsl:apply-templates select="." mode="table"/>
      </td>
  </xsl:template>

  <xsl:template match="row" mode="table">
      <table>
          <thead>
              <tr>
                  <th>Table <xsl:number/></th>
                  <xsl:apply-templates select="*" mode="th"/>
              </tr>
          </thead>
          <tbody>
              <tr>
                  <td><xsl:number/></td>
                  <xsl:apply-templates select="*"/>
              </tr>
          </tbody>
      </table>
  </xsl:template>

  <xsl:template match="row/*" mode="th">
      <th>
          <xsl:value-of select="local-name()"/>
      </th>
  </xsl:template>

  <xsl:template match="row/*">
      <td>
          <xsl:value-of select="."/>
      </td>
  </xsl:template>

  <xsl:template match="row/image">
      <td>
          Image <xsl:number count="row"/> <img src="{.}" alt="image"/>
      </td>
  </xsl:template>

</xsl:stylesheet>

https : //xsltfiddle.liberty-development.net/6qVRKwi

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

  <xsl:template match="row" mode="row">
      <tr>
          <xsl:apply-templates select=". | following-sibling::row[1]" mode="cell"/>
          <xsl:if test="not(following-sibling::row)">
              <td></td>
          </xsl:if>
      </tr>
  </xsl:template>

, как это сделано в https://xsltfiddle.liberty-development.net/6qVRKwi/1

1
ответ дан Martin Honnen 17 August 2018 в 12:20
поделиться
  • 1
    Это выглядит очень интересно. Мне понадобится пару часов, чтобы реализовать его с моими данными, и как только я его испытаю, я дам вам знать. – Michael 14 July 2018 в 17:13
  • 2
    К сожалению, это не сработало для моей проблемы MS-Word (я изменил теги из html). – Michael 15 July 2018 в 01:09
Другие вопросы по тегам:

Похожие вопросы: