XSLT-生成地址标签
更新重新表述问题以澄清混淆XSLT-生成地址标签,xslt,xsl-fo,apache-fop,Xslt,Xsl Fo,Apache Fop,更新重新表述问题以澄清混淆 我正在使用ApacheFop翻译的XSLT和XSL:FO。我想打印地址标签 输入 <?xml version="1.0" encoding="utf-8" ?> <workOrders> <workOrder> <number>111</number> <PartNumber>110022</PartNumber> <col3>222</c
我正在使用ApacheFop翻译的XSLT和XSL:FO。我想打印地址标签 输入
<?xml version="1.0" encoding="utf-8" ?>
<workOrders>
<workOrder>
<number>111</number>
<PartNumber>110022</PartNumber>
<col3>222</col3>
<Qty>333</Qty>
</workOrder>
<workOrder>
<number>111</number>
<PartNumber>110022</PartNumber>
<col3>222</col3>
<Qty>333</Qty>
</workOrder>
<!--Manually copy/paste the workOrder until you have 47 of them..-->
</workOrders>
111
110022
222
333
111
110022
222
333
输出第1页(整页6行x 3列)
第2页与第1页相同 第3页(部分页…在本例中为4行x 3列,最后一项为空)
更新2
我接通了亚历杭德罗的解决方案。ApacheFop报告了一个错误 样式表中的此位置不允许使用xsl:template 下面是从HTML内容转换为XSL:FO的代码。错误点由注释标记。我搞砸了什么
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<!-- layout for the first page -->
<fo:simple-page-master master-name="first"
page-height="11in"
page-width="8.5in"
margin-top="1cm"
margin-bottom="1cm"
margin-left="1cm"
margin-right="1cm">
<fo:region-body margin-top="0cm"/>
<fo:region-before extent="1cm"/>
<fo:region-after extent="0cm"/>
</fo:simple-page-master>
<!-- layout for the other pages -->
<fo:simple-page-master master-name="rest"
page-height="11in"
page-width="8.5in"
margin-top="1cm"
margin-bottom="1cm"
margin-left="1cm"
margin-right="1cm">
<fo:region-body margin-top="0cm"/>
<fo:region-before extent="1cm"/>
<fo:region-after extent="0cm"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="basicPSM" >
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="first" page-position="first" />
<fo:conditional-page-master-reference master-reference="rest" page-position="rest" />
<!-- recommended fallback procedure -->
<fo:conditional-page-master-reference master-reference="rest" />
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
</fo:layout-master-set>
<!-- end: defines page layout -->
<!-- actual layout -->
<fo:page-sequence master-reference="basicPSM">
<fo:flow flow-name="xsl-region-body">
<xsl:template match="/" name="tables"><!--ERROR REFERS TO HERE-->
<xsl:param name="pRows" select="3"/>
<xsl:param name="pColumns" select="3"/>
<xsl:param name="pSequence" select="*/*"/>
<xsl:variable name="vSize" select="$pRows * $pColumns"/>
<xsl:for-each select="$pSequence[position() mod $vSize = 1]">
<xsl:variable name="vPosition" select="position()"/>
<fo:table table-layout="fixed" width="63mm" border-collapse="separate" wrap-option="wrap">
<fo:table-body wrap-option="wrap">
<xsl:call-template name="rows">
<xsl:with-param name="pSequence"
select="$pSequence[
position() > ($vPosition - 1) * $vSize
and
$vPosition * $vSize + 1 > position()
]"/>
</xsl:call-template>
</fo:table-body>
</fo:table>
</xsl:for-each>
</xsl:template>
<xsl:template name="rows">
<xsl:param name="pSequence" select="/.."/>
<xsl:param name="pRow" select="$pRows"/>
<xsl:if test="$pRow">
<xsl:call-template name="rows">
<xsl:with-param name="pSequence" select="$pSequence"/>
<xsl:with-param name="pRow" select="$pRow - 1"/>
</xsl:call-template>
<fo:table-row wrap-option="wrap">
<xsl:call-template name="columns">
<xsl:with-param name="pSequence"
select="$pSequence[
position() > ($pRow - 1) * $pColumns
and
$pRow * $pColumns + 1 > position()
]"/>
</xsl:call-template>
</fo:table-row>
</xsl:if>
</xsl:template>
<xsl:template name="columns">
<xsl:param name="pSequence" select="/.."/>
<xsl:param name="pColumn" select="$pColumns"/>
<xsl:if test="$pColumn">
<xsl:call-template name="columns">
<xsl:with-param name="pSequence" select="$pSequence"/>
<xsl:with-param name="pColumn" select="$pColumn - 1"/>
</xsl:call-template>
<fo:table-cell width="90mm">
<fo:block wrap-option="wrap">
<xsl:apply-templates select="$pSequence[$pColumn]"/>
</fo:block>
</fo:table-cell>
</xsl:if>
</xsl:template>
<xsl:output method="xml"/>
<xsl:template match="/">
<xsl:call-template name="tables">
<xsl:with-param name="pSequence" select="workOrders/workOrder[position()!=1]"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="workOrder">
<xsl:value-of select="PartNumber"/>
</xsl:template>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:stylesheet>
如果您知道订单不超过18份,您可以使用以下内容:
<xsl:if test="Order">
<tableRow>
<xsl:apply-templates select="Order[position() <= 6]" />
</tableRow>
<xsl:if test="Order[7]">
<tableRow>
<xsl:apply-templates select="Order[position() <= 12 and position() > 6]" />
</tableRow>
<xsl:if test="Order[13]">
<tableRow>
<xsl:apply-templates select="Order[position() <= 18 and position() > 12]" />
</tableRow>
</xsl:if>
</xsl:if>
</xsl:if>
此XSLT 1.0样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="pRows" select="6"/>
<xsl:param name="pColumns" select="3"/>
<xsl:variable name="pCells" select="$pRows * $pColumns"/>
<xsl:template match="workOrders">
<xsl:apply-templates
select="workOrder[position() mod $pCells = 1]"
mode="table"/>
</xsl:template>
<xsl:template match="workOrder" mode="table">
<table>
<xsl:apply-templates
select="(.|following-sibling::workOrder
[$pCells > position()])
[position() mod $pColumns = 1]"
mode="row"/>
</table>
</xsl:template>
<xsl:template match="workOrder" mode="row">
<tr>
<xsl:apply-templates
select="(.|following-sibling::workOrder
[$pColumns > position()])"
mode="cell"/>
</tr>
</xsl:template>
<xsl:template match="workOrder" mode="cell">
<td>
<xsl:value-of select="PartNumber"/>
</td>
</xsl:template>
</xsl:stylesheet>
“困难的部分是确保它们在列中相邻排列。”-此要求不明确。这是否意味着困难的部分是将它们分成几行?哪些单元格应该与哪些单元格对齐?您使用的是XSLT 2还是必须使用XSLT 1?@P.Brian.Mackey:这些表格问题有很多答案。您需要提供一个精简但有意义的输入样本和准确的所需输出。@Alejandro-这里有一个简化的示例。@P.Brian.Mackey:在@LarsH:真的吗?我认为写这篇文章比写一个标准的解决方案更难。@Alej:可能对你来说,是的。:-)但我想我还没有掌握标准技术,因为这样想对我来说更容易。@Alej-即使现在,我想不出比这更容易的XSLT1.0“标准”解决方案了。我很想看看你的解决方案。@LarsH-每页有18个元素。我试图简化这个问题,但我想我失败了。我重新表述了这个问题。@OP:如果@Alej是对的,那么一个更标准的解决方案会更好。不幸的是,我现在没有时间去做这件事,但也许@Alej可以回答,或者我稍后再看看我是否可以回答。+1是的,就是这样!!!耶塔!因此,对于未来的FO实现者来说,唯一的其他次要细节是您需要确保
xmlns:FO=”http://www.w3.org/1999/XSL/Format“
是在xsl:stylesheet
级别定义的,而不是fo:root
!
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="pRows" select="6"/>
<xsl:param name="pColumns" select="3"/>
<xsl:variable name="pCells" select="$pRows * $pColumns"/>
<xsl:template match="workOrders">
<xsl:apply-templates
select="workOrder[position() mod $pCells = 1]"
mode="table"/>
</xsl:template>
<xsl:template match="workOrder" mode="table">
<table>
<xsl:apply-templates
select="(.|following-sibling::workOrder
[$pCells > position()])
[position() mod $pColumns = 1]"
mode="row"/>
</table>
</xsl:template>
<xsl:template match="workOrder" mode="row">
<tr>
<xsl:apply-templates
select="(.|following-sibling::workOrder
[$pColumns > position()])"
mode="cell"/>
</tr>
</xsl:template>
<xsl:template match="workOrder" mode="cell">
<td>
<xsl:value-of select="PartNumber"/>
</td>
</xsl:template>
</xsl:stylesheet>
<table>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
</table>
<table>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
</table>
<table>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
<td>110022</td>
</tr>
<tr>
<td>110022</td>
<td>110022</td>
</tr>
</table>