fo: таблица в таблицу html - xslt
Я пытаюсь написать xslt для создания другого xslt, целью которого является замена только всех xsl: fo на html тэги..XSLT 1
Я использую CDATA вокруг пространства имен "xsl", чтобы избежать обработки тегов такого типа xslt. Моя область действия обрабатывает только директиву xsl: fo и заменяет, например:
<fo:table table-layout="fixed" width="100%" font-size="10pt">
<fo:table-column column-width="proportional-column-width(0.65)"/>
<fo:table-column column-width="proportional-column-width(0.35)"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell padding-before="0.5cm"></fo:table-cell>
<fo:table-cell padding-before="0.5cm">
<fo:block>
y
<![CDATA[ --> this is treated as text so i can copy it with <xsl-valueof select="."/>??
<xsl:choose>
<xsl:when test="...xpath'">
<xsl:value-of select="..." />,
</xsl:when>
<xsl:otherwise>
at <xsl:value-of select=..." />,
</xsl:otherwise>
</xsl:choose>]]>
</fo:block>
<fo:block space-before="0.5cm" text-align="center">
x
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
Я хочу traslate fo: table + fo: table-body с тегом table, и fo: table-column с td width="..%", fo:table-row с tr.. Td width не так легко получить, потому что Свойство width принадлежит fo: table-column и fo: table-cell, обрабатывающим тег.
Я пытаюсь зациклить fo: table-column, когда я читаю ячейку таблицы, я пишу td и вычисляю ширину, используя свойство column-width, полученное с помощью тега прецедента fo: table-column: я использую position() таблицы тегов -колонна (первый цикл) в fo: выбор ячейки таблицы
например вот мой xslt tralslator для xsl:fo (вышеупомянутый):
<xsl:template name="fo-table">
<xsl:param name="font-size" />
<xsl:param name="width" />
<xsl:variable name="cols" select="count(fo:table-column)"/>
<xsl:if test="fo:table-column">
<xsl:variable name="effective-cols" select="count(fo:table-body/fo:table-row/fo:table-cell)"/>
<xsl:if test="$cols = $effective-cols">
<table>
<xsl:for-each select="fo:table-body/fo:table-row">
<tr>
<xsl:for-each select="parent::*/parent::*/fo:table-column">
<xsl:variable name="width-proportional">
<xsl:value-of select="@column-width"/>
</xsl:variable>
<td>
<xsl:attribute name="width">
<xsl:call-template name="getPercentWidth">
<xsl:with-param name="proportional-value-width"><xsl:value-of select="$width-proportional"/></xsl:with-param>
</xsl:call-template>
</xsl:attribute>
abc <xsl:variable name="vPosition"><xsl:value-of select="position()"/></xsl:variable>
<xsl:for-each select="parent::*/fo:table-body/fo:table-row/*[$vPosition]">
<xsl:value-of select="local-name()"/><xsl:text> #10;</xsl:text> <!-- debug-->
<xsl:choose>
<xsl:when test="fo:block">
<xsl:for-each select="fo:block">
<xsl:call-template name="fo-block-table">
<xsl:with-param name="text-align"><xsl:value-of select="@text-align"/></xsl:with-param>
<xsl:with-param name="space-before"><xsl:value-of select="@space-before"/></xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
empty cell
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template name="fo-block-table">
<xsl:param name="text-align" />
<xsl:param name="space-before" />
<xsl:choose>
<xsl:when test="$text-align">
<div>
<xsl:attribute name="text-align">
<xsl:value-of select="normalize-space($text-align)"/>
</xsl:attribute>
<xsl:apply-templates select="."/>
</div>
</xsl:when>
<xsl:otherwise>
<div>
<xsl:apply-templates select="."/>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="getPercentWidth">
<xsl:param name="proportional-value-width"/>
<xsl:variable name="width" select="normalize-space($proportional-value-width)"/>
<xsl:variable name="begin"> <xsl:value-of select="string-length(substring-before($width, '('))" /></xsl:variable>
<xsl:variable name="last"> <xsl:value-of select="string-length(substring-before($width,')'))" /></xsl:variable>
<xsl:variable name="val" select="fn:substring($width, $begin, $last)" />
<xsl:variable name="val1" select="substring-after($val,'(')"/>
<xsl:variable name="cent" select="100"/>
<xsl:value-of select="concat(($val1 * $cent),'%')"/>
</xsl:template>
Но я не могу понять, почему все td содержат 'y',x и empty, когда он будет принадлежать только пустой ячейке таблицы, кажется, что он читает все fo:block..
<table>
<tr>
<td width="65%">
abc
table-cell #10;
empty cell
table-cell #10;<div>
y
</div>
<div text-align="center">
x
</div>
</td>
<td width="35%">
abc
table-cell #10;
empty cell
table-cell #10;<div>
y
</div>
<div text-align="center">
x
</div>
</td>
</tr>
</table>
Мне нужно получить:
<table>
<tr>
<td width="65%">
abc
table-cell #10;
empty cell
</td>
<td width="35%">
abc
table-cell #10;
<div>
y
</div>
<div text-align="center">
x
</div>
</td>
</tr>
</table>
если я заменю второй цикл xsl: for-each с
xsl : template
не соответствует ничто! Возможно *[$vPosition] не работает, но работает, если я заменяю число, например 1 или 2..
В чем дело?
Спасибо за совет!
Roby
1 ответ
Проблема с этой линией...
<xsl:for-each select="parent::*/fo:table-body/fo:table-row/*[$vPosition]">
Или, скорее, это связано с тем, как vPosition
переменная определяется:
<xsl:variable name="vPosition"><xsl:value-of select="position()"/></xsl:variable>
Используя xsl:value-of
вы на самом деле вызываете vPosition
быть установленным на строковое значение, а не числовое значение. Когда вы используете строковое значение в условии, как [*$vPosition]
он всегда будет возвращать true, если эта строка не пуста.
Попробуйте изменить объявление переменной на это, которое установит vPosition
быть числом
<xsl:variable name="vPosition" select="position()" />