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
元素的放置位置。