Xslt 防止XSL循环打印每个值
当Xslt 防止XSL循环打印每个值,xslt,xslt-1.0,xsl-fo,Xslt,Xslt 1.0,Xsl Fo,当servtypes等于“Service 3”时,我需要获取servtypes和servamt值。我使用了XSL逻辑,它以某种方式获得了“服务3”及其相应的数量 XSL代码: <xsl:for-each select="service"> <fo:table-row> <fo:table-cell padding-left="14pt" display-align="center"> <fo:block&g
servtypes
等于“Service 3”时,我需要获取servtypes
和servamt
值。我使用了XSL逻辑,它以某种方式获得了“服务3”及其相应的数量
XSL代码:
<xsl:for-each select="service">
<fo:table-row>
<fo:table-cell padding-left="14pt" display-align="center">
<fo:block>
<xsl:if test="servtypes='Service 3'">
<xsl:value-of select="servtypes"/>
</xsl:if>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="left" >
<fo:block>
<xsl:if test="servtypes='Service 3'">
<xsl:value-of select="servamt"/>
</xsl:if>
</fo:block>
</fo:table-cell>
<fo:table-cell padding-left="14pt" display-align="center">
<fo:block>
<fo:leader/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
XML示例
<charges>
<fees>25</fees>
<desc>Description</desc>
<service>
<servtypes>Service 1</servtypes>
<servamt>150</servamt>
</service>
<service>
<servtypes>Service 2</sertypes>
<servamt>10</servamt>
</service>
<service>
<servtypes>Service 3</servtypes>
<servamt>150</servamt>
</service>
<charges>
25
描述
服务1
150
服务2
10
服务3
150
问题在于,每当它循环遍历不同的服务值时,它也会为每个不匹配的服务创建表行,并且单元格包含空白值。请参见下表。
如何防止创建空行和单元格,而只创建一个值仅与服务3匹配的表
空白
空白
空白
空白
空白
空白
服务3
服务价值
服务
解决方案很简单:不匹配您不需要的
在下面的代码中,我将匹配表达式放在xsl:template match=”“
规则中,并从匹配中排除其余的text()
。我还删除了xsl:if
s
<xsl:template match="text()" />
<xsl:template match="/charges">
<xsl:apply-templates select="service" />
</xsl:template>
<xsl:template match="service[servtypes='Service 3']">
<fo:table-row>
<fo:table-cell padding-left="14pt" display-align="center">
<fo:block>
<xsl:value-of select="servtypes"/>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="left" >
<fo:block>
<xsl:value-of select="servamt"/>
</fo:block>
</fo:table-cell>
<fo:table-cell padding-left="14pt" display-align="center">
<fo:block>
<fo:leader/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
解决方案很简单:不匹配您不需要的
在下面的代码中,我将匹配表达式放在xsl:template match=”“
规则中,并从匹配中排除其余的text()
。我还删除了xsl:if
s
<xsl:template match="text()" />
<xsl:template match="/charges">
<xsl:apply-templates select="service" />
</xsl:template>
<xsl:template match="service[servtypes='Service 3']">
<fo:table-row>
<fo:table-cell padding-left="14pt" display-align="center">
<fo:block>
<xsl:value-of select="servtypes"/>
</fo:block>
</fo:table-cell>
<fo:table-cell text-align="left" >
<fo:block>
<xsl:value-of select="servamt"/>
</fo:block>
</fo:table-cell>
<fo:table-cell padding-left="14pt" display-align="center">
<fo:block>
<fo:leader/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
第三个代码片段是一个HTML表。但是XSLT代码生成XSL-FO标记。请澄清。@mzjn是的,但我只是想用表格的形式说明输出,因为它很容易描述。只要运行代码片段,它就会显示表格。我认为这很混乱。这个问题与HTML无关。@mzjn我想显示的结果/输出是表格格式的,但因为在中,我无法像在excel中那样轻松地生成表格,所以我不得不使用HTML创建一个简单的表格,以便描述xslt代码的输出。第三个代码片段是HTML表格。但是XSLT代码生成XSL-FO标记。请澄清。@mzjn是的,但我只是想用表格的形式说明输出,因为它很容易描述。只要运行代码片段,它就会显示表格。我认为这很混乱。这个问题与HTML无关。@mzjn我想显示的结果/输出是表格格式的,但由于在中,我无法像在excel中那样轻松地制表,所以我不得不使用HTML创建一个简单的表,以便描述xslt代码的输出。谢谢您的帮助。我尝试了您回答的代码,但我发现错误:样式表中的此位置不允许使用xsl:template。请查看样式表中放置xsl:template
元素的位置。感谢您的帮助。我尝试了您回答的代码,但我得到了以下错误:样式表中的此位置不允许使用xsl:template。请查看样式表中xsl:template
元素的放置位置。