使用参数作为 XSL select 语句的参数

Using a param as the argument to XSL select statement

我正在使用 apache fop 生成 PDF,我有一个生成 table 的 XSL-FO 模板,我希望能够多次调用该模板,使用不同的 select参数。

这是我的 xsl 样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"
                version="1.0">
    <xsl:output method="html"/>

    <xsl:template name="checklist">
        <xsl:param name="H1"/>
        <xsl:param name="H2"/>
        <xsl:param name="H3"/>
        <xsl:param name="src"/>
        <fo:block width="19cm" >
            <fo:table  font-size="8pt" table-layout="fixed" width="100%">
                <fo:table-column column-width="1.2cm"/>
                <fo:table-column column-width="16.5cm"/>
                <fo:table-column column-width="1.2cm"/>
                <fo:table-header font-weight="bold" background-color="lightgrey">
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block><xsl:value-of select="$H1"/></fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block text-align="center"><xsl:value-of select="$H2"/></fo:block>
                        </fo:table-cell>
                        <fo:table-cell>
                            <fo:block><xsl:value-of select="$H3"/></fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                </fo:table-header>
                <fo:table-body>

                    <xsl:apply-templates select="$src" />

                </fo:table-body>
            </fo:table>
        </fo:block>
    </xsl:template>

    <xsl:template match="item">
        <fo:table-row line-stacking-strategy="line-height" margin="0mm" space-before="1mm" background-color="white">
            <xsl:variable name="hdr" select="hdr"/>
            <xsl:choose>
                <xsl:when test="$hdr = 'y'">
                    <fo:table-cell number-columns-spanned="3" background-color="lightgrey" border="1px solid #b8b6b6">
                        <fo:block>
                            <fo:inline>
                                <xsl:value-of select="id"/>&#x00A0;
                                <xsl:value-of select="description"/>
                            </fo:inline>
                        </fo:block>
                    </fo:table-cell>
                </xsl:when>
                <xsl:otherwise>
                    <fo:table-cell border="1px solid #b8b6b6" vertical-align="middle" text-align="center">
                        
                        <fo:block line-height="4mm">
                            <xsl:value-of select="id"/>
                        </fo:block>
                    </fo:table-cell>
                    <fo:table-cell border="1px solid #b8b6b6" padding-left="3pt">
                        <fo:block>
                            <xsl:value-of select="description"/>
                        </fo:block>
                    </fo:table-cell>
                    <fo:table-cell border="1px solid #b8b6b6" text-align="center" padding-right="3pt">
                        <xsl:variable name="outcome" select="outcome"/>
                        <fo:block color="white">
                            <!--<fo:external-graphic src="file:///F:/Projects/Active/eCert/src/resources/c1.svg" width="4.0mm" height="4.0mm" content-width="scale-to-fit" content-height="scale-to-fit"/>-->
                            <xsl:choose>
                                <xsl:when test="$outcome = 'ok'">
                                    <fo:external-graphic src="file:///F:/Projects/Active/eCert/src/resources/c1n.svg" vertical-align="middle" height="4.0mm" content-height="scale-to-fit"/>
                                </xsl:when>
                                <xsl:when test="$outcome = 'c1'">
                                    <fo:external-graphic src="file:///F:/Projects/Active/eCert/src/resources/ok.svg" vertical-align="middle" height="3.9mm" content-height="scale-to-fit"/>
                                </xsl:when>
                                <xsl:when test="$outcome = 'c2'">
                                    <fo:external-graphic src="file:///F:/Projects/Active/eCert/src/resources/c2.svg" vertical-align="middle" height="3.8mm" content-height="scale-to-fit"/>
                                </xsl:when>
                                <xsl:when test="$outcome = 'c3'">
                                    <fo:external-graphic src="file:///F:/Projects/Active/eCert/src/resources/c3.svg" vertical-align="middle" height="3.7mm" content-height="scale-to-fit"/>
                                </xsl:when>
                                <xsl:when test="$outcome = 'fi'">
                                    <fo:external-graphic src="file:///F:/Projects/Active/eCert/src/resources/fi.svg" vertical-align="middle" height="3.6mm" content-height="scale-to-fit"/>
                                </xsl:when>
                                <xsl:when test="$outcome = 'nv'">
                                    <fo:external-graphic src="file:///F:/Projects/Active/eCert/src/resources/nv.svg" vertical-align="middle" height="3.5mm" content-height="scale-to-fit"/>
                                </xsl:when>
                                <xsl:when test="$outcome = 'na'">
                                    <fo:external-graphic src="file:///F:/Projects/Active/eCert/src/resources/na.svg" vertical-align="middle"  height="3.4mm"  content-height="scale-to-fit"/>
                                </xsl:when>
                                <xsl:when test="$outcome = 'lim'">
                                    <fo:external-graphic src="file:///F:/Projects/Active/eCert/src/resources/lim.svg" vertical-align="middle" height="3.3mm" content-height="scale-to-fit"/>
                                </xsl:when>
                            </xsl:choose>
                        </fo:block>
                
                    </fo:table-cell>
                </xsl:otherwise>
            </xsl:choose>
        </fo:table-row>
    </xsl:template>

</xsl:stylesheet>

这里是调用模板的流程之一

<fo:flow flow-name="xsl-region-body">
                    <fo:block />
                    <xsl:call-template name="checklist">
                        <xsl:with-param name="H1" select="'Item No.'"/>
                        <xsl:with-param name="H2" select="'Description'"/>
                        <xsl:with-param name="H3" select="'Outcome'"/>
                        <xsl:with-param name="src" select="'eicr/checklist/item'"/>
                        
                    </xsl:call-template>
                        
                </fo:flow>

当我执行 FOP 时出现以下错误 ** 无法将 #STRING 转换为 NodeList!** 参数 H1、H2 和 H3 用作列 headers 并且该部分工作正常 src 参数应该用于 select 来自 xml 列表的项目。

我是新的 xsl fo,所以任何帮助或指向可以帮助我实现预期结果的文档的指针都将不胜感激。

非常感谢

删除 eicr/checklist/item 周围的单引号。 'eicr/checklist/item' 是字符串文字; eicr/checklist/item 是一个位置路径,它将 select 个元素相对于上下文节点。


我试图避免的替代方案(因为它更冗长)是在调用模板之前或作为调用模板的一部分应用模板,然后将结果复制到结果树:

<xsl:with-param name="src">
   <xsl:apply-templates select="eicr/checklist/item" />
</xsl:with-param>
<fo:table-body>
  <xsl:copy-of select="$src" />
</fo:table-body>

这是您在 DocBook XSLT 1.0 样式表中看到的一种技术,例如:

https://github.com/docbook/xslt10-stylesheets/blob/6ff683948c5a85949e4b7661f302e8b5f12f7bf2/xsl/fo/block.xsl#L181