Используйте xslt для добавленияв XML - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно визуализировать 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>

1 Ответ

1 голос
/ 07 ноября 2019

Это займет вашу первую строку таблицы с некоторыми данными ширины и будет использовать ее для вывода.

<xsl:template match="@* | *">
    <xsl:copy>
        <xsl:apply-templates select="@* | * | text()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="fo:table">
    <xsl:copy>
        <xsl:for-each select=".//fo:table-row[fo:table-cell/@width][1]/fo:table-cell">
            <fo:table-column>
                <xsl:attribute name="column-width" select="@width"/>
            </fo:table-column>
        </xsl:for-each>
        <xsl:apply-templates select="@* | *"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
...