Мне нужно визуализировать PDF-файлы с использованием XML-файлов. По некоторым причинам Механизм PDF не очень хорошо работает с таблицами, ширина которых указана в процентах.
Это исходный html
<table class="table">
<thead>
<tr>
<td style="width:60%;">foo</td>
<td style="width:40%;">bla</td>
</tr>
</thead>
<tbody>
<tr>
<td>foo</td>
<td>bla</td>
</tr>
</tbody>
</table>
С существующим xslt он преобразуется в xml1:
<fo:table>
<fo:table-header>
<fo:table-row>
<fo:table-cell width="60%">
fool
</fo:table-cell>
<fo:table-cell width="40%">
bla
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
foo
</fo:table-cell>
<fo:table-cell>
bla
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
Таблица PDF с использованием вышеуказанного xml не будет делиться на 60% 40%.
Однако, все в порядке
xml 2
<fo:table>
<fo:table-column column-width="60%"/>
<fo:table-column column-width="40%"/>
<fo:table-header>
<fo:table-row>
<fo:table-cell width="60%">
foo
</fo:table-cell>
<fo:table-cell width="40%">
bla
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell
foo
</fo:table-cell>
<fo:table-cell>
bla
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
Таким образом, вопрос, учитывая исходный html, как использовать xslt для добавления элемента <fo:table-column>
ниже элемента <fo:table>
, используя соответствующее значение <fo:table-cell width=
? В идеале не должно быть дубликатов <fo:table-column>
, если xml 1 имеет несколько <fo:table-row>
.
Мне просто нужно добавить дополнительные <fo:table-column>
, потому что другие преобразования выполняются.
У меня естьрассмотрел некоторые похожие вопросы, но все еще не получил решения Добавление элемента в середине xml с помощью xslt
Мой текущий apporach:
<xsl:template match="html:table">
<xsl:copy>
<xsl:for-each select=".//html:tr[html:td/@style][1]/html:td">
<xsl:if test="contains(@style,'width')">
<fo:table-column>
<xsl:attribute name="column-width">
<xsl:value-of select="substring-after(substring-before(@style, ';'),'width:')"/>
</xsl:attribute>
</fo:table-column>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
Это не работает, потому что <fo:table-column>
не добавляется ниже оригинального <fo-table
, но вместо этого создается новый <fo-table>
и туда добавляется <fo:table-column>