Вы правы - вы объявили новый тип использования (Name_pairs), и вам нужна переменная этого типа, чтобы использовать его.
Код должен выглядеть следующим образом:
Name_pairs np;
np.read_names()
При первом вызове данных измените на
<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>
. Это должно выровнять данные так, как вы хотите .
Если целью является сопоставление последовательности элементов 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