首先,我试图在XSLT、XPath和XSL的帮助下从XML创建PDF。
我有一个带有多个脚注的XML,我使用一个模板在标签名"note“之后自动呈现它们。
XML:
<document>
<ul type='custom-list-1' startdist="0.5cm" gap="0.15cm">
<li space-before="30pt">
List-item 1
<block margin-left="-15pt" margin-right="-15pt" text-align="center">
<table layout="fixed" width="100%">
<col number="1" width="30%" />
<col number="2" width="17%" />
<col number="3" width="17%" />
<col number="4" width="17%" />
<col number="5" width="17%" />
<tbody>
<tr font-style="italic">
<th>sample title</th>
<th colspan="4">sample title</th>
</tr>
<tr>
<td>
Bla bla bla
<note name="name-1">
Footnote for "bla bla bla"
</note>
</td>
<td colspan="4">
.............
</td>
</tr>
<tr>
<td>
Comision Administrare Online Banking
</td>
<td colspan="4">
.........
</td>
</tr>
<tr>
<td>
Another... Bla bla bla
<note name="name-2">
Footnote for "Another... Bbla bla bla"
</note>
</td>
<td colspan="4">
......
</td>
</tr>
</tbody>
</table>
</block>
</li>
<li space-before="30pt">List-item 2:
<block margin-left="-15pt" text-align="center">
<table layout="fixed" width="100%">
<col number="1" width="18%" />
<col number="2" width="13%" />
<col number="3" width="13%" />
<col number="4" width="16%" />
<col number="5" width="13%" />
<col number="6" width="13%" />
<col number="7" width="13%" />
<tbody>
<tr font-style="italic">
<th colspan="2" rowspan="2">Sample title</th>
<th colspan="2">Sample title</th>
<th rowspan="2">Sample title</th>
<th rowspan="2">Sample title</th>
<th rowspan="2">Sample title</th>
</tr>
<tr font-style="italic">
<th>Min</th>
<th>Max</th>
</tr>
<tr>
<td colspan="2">Some text here</td>
<td colspan="2">
1%
<note name="name-3">
Footnote for "1%"
</note>
/ 0.5%
<note name="name-4">
Footnote for "0.5%"
</note>
</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td colspan="2">Sample text</td>
<td colspan="2">
1%
<note name="name-3">
Footnote for "1%"
</note>
/ 0.5%
<note name="name-4">
Footnote for "0.5%"
</note>
</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
<tr>
<td colspan="2">Sample text</td>
<td colspan="2">
1%
<note name="name-3">
Footnote for "1%"
</note>
/ 0.5%
<note name="name-4">
Footnote for "0.5%"
</note>
</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>
</tbody>
</table>
</block>
</li>
<li space-before="30pt">List-item 3
<block margin-left="-15pt" text-align="center">
<table layout="fixed" width="100%">
<col number="1" width="25%" />
<col number="2" width="15%" />
<col number="3" width="15%" />
<col number="4" width="22%" />
<col number="5" width="22%" />
<tbody>
<tr font-style="italic">
<th colspan="2">Sample title</th>
<th></th>
<th>Sample title</th>
<th>Sample title</th>
</tr>
<tr>
<td colspan="2">Sample text</td>
<td></td>
<td>0%</td>
<td>0%</td>
</tr>
<tr>
<td colspan="2">Sample text</td>
<td></td>
<td>0.05%<note name="name-5">Footnote for "0.05%"</note></td>
<td>0.05%</td>
</tr>
<tr>
<td colspan="2">Sample text</td>
<td></td>
<td>0%</td>
<td>0%</td>
</tr>
</tbody>
</table>
</block>
</li>
</ul>
XSLT:
<xsl:attribute-set name="note.data" >
<xsl:attribute name="text-align">justify</xsl:attribute>
<xsl:attribute name="font-weight">normal</xsl:attribute>
</xsl:attribute-set>
<xsl:key name="by-name" match="//note[@name]" use="@name" />
<xsl:template match="note">
<xsl:call-template name="note" />
</xsl:template>
<xsl:template name="note">
<xsl:param name="unique-elements"
select="current()[generate-id(.) = generate-id(key('by-name', @name)[1])]"/>
<xsl:param name="identical-elements"
select="current()[not(generate-id(.) = generate-id(key('by-name', @name)[1]))]"/>
<xsl:if test="$unique-elements">
<xsl:variable name="element" select="$unique-elements"/>
<fo:footnote>
<fo:inline baseline-shift="super" font-size="75%" color="red">
<xsl:number level="any" count="//note[generate-id(.) = generate-id(key('by-name', @name)[1])]" format="(1)" />
</fo:inline>
<fo:footnote-body xsl:use-attribute-sets="note.data">
<fo:block color="blue">
<fo:inline baseline-shift="super" font-size="75%">
<xsl:number level="any" count="//note[generate-id(.) = generate-id(key('by-name', @name)[1])]" format="(1)" />
</fo:inline>
<xsl:value-of select="$element" />
</fo:block>
</fo:footnote-body>
</fo:footnote>
</xsl:if>
<xsl:if test="$identical-elements">
<fo:inline baseline-shift="super" font-size="75%" color="green">
<xsl:number level="any" count="//note[generate-id(.) = generate-id(key('by-name', @name)[1])]" format="(1)" />
</fo:inline>
</xsl:if>
</xsl:template>PDF输出:

因此,我设法抑制相同的脚注,保持唯一脚注的计数(以红色显示的图像),并为相同的脚注(以绿色显示的图像)添加最后的计数值。
现在的问题是,我不知道如何为相同的脚注保持相同的计数值。
提前感谢!
发布于 2014-02-28 17:23:31
因此,这里有一个解决方案,但不使用xsl:number,这通常会让我感到头疼,但既然您一直在使用level=“任何”,这并不重要:
<xsl:template match="note">
<!--
counts unique preceding notes starting from first note with current @name
-->
<xsl:variable name="number"
select="count((//note[@name=current()/@name])[1]/preceding::note[not(@name=../preceding::note/@name)]) + 1"/>
<xsl:choose>
<!-- if there is no preceding note with same name -->
<xsl:when test="not(preceding::note/@name=current()/@name)">
<fo:footnote>
<fo:inline baseline-shift="super" font-size="75%" color="red">(<xsl:value-of
select="$number"/>)</fo:inline>
<fo:footnote-body>
<fo:block color="blue">
<xsl:if test="@margin-left">
<xsl:attribute name="margin-left">
<xsl:value-of select="@margin-left"/>
</xsl:attribute>
</xsl:if>
<fo:inline baseline-shift="super" font-size="75%">(<xsl:value-of select="$number"
/>)</fo:inline>
<xsl:value-of select="."/>
</fo:block>
</fo:footnote-body>
</fo:footnote>
</xsl:when>
<xsl:otherwise>
<fo:inline baseline-shift="super" font-size="75%" color="red">(<xsl:value-of
select="$number"/>)</fo:inline>
</xsl:otherwise>
</xsl:choose>
</xsl:template>发布于 2014-02-28 14:38:07
最好的方法是分组相同的笔记,然后从每一组中选择第一张。使用XSLT2.0,您可以使用group-by属性。在XSLT1.0中,您可以这样做,为所有注释创建一个键:
<xsl:key name="notes" match="//note" use="@name"/>然后使用如下所示的谓词调用模板:
<xsl:template match="parent-element">
...
<xsl:apply-templates select="note[generate-id(.) = generate-id( key('notes', @name)[1])]" />
...
</xsl:template>表达式将当前note (.)与notes组中的第一项与相同的@name进行比较,因此您将选择每个组的第一项。
您还必须修正节点计数,并将其限制在精简的集合(因为它正在计算所有节点,包括重复的节点):
note[generate-id(.) = generate-id( key('notes', @name)[1])]发布于 2017-05-05 08:58:37
如果您使用的是AH格式化程序,则可以通过使用适当命名的axf:suppress-duplicate-footnote扩展属性来抑制同一页上的重复脚注。参见https://www.antennahouse.com/product/ahf64/ahf-ext.html#axf.suppress-duplicate-footnote和https://www.antennahouse.com/antenna1/comprehensive-xsl-fo-tutorials-and-samples-collection/中的“列文档中的脚注安排(axf:脚注-位置)”示例。
https://stackoverflow.com/questions/22094646
复制相似问题