防止XSL循环打印每个值

时间:2018-01-28 19:09:50

标签: xslt xslt-1.0 xsl-fo

x <- "[Bridge]\r\r\n\r\r\n SPOCK: Check the circuit. \r\r\n [Pike's Quarters \r\r\n BOYCE: Boyce here.\r\r\n" x <- gsub("\\[[^]\r\n]*(?:]|\\R)", " ", x, perl=TRUE) x ## => [1] " \r\r\n\r\r\n SPOCK: Check the circuit. \r\r\n \r\n BOYCE: Boyce here.\r\r\n" 等于&#34;服务3&#34;时,我需要获取servtypesservamt值。我使用了XSL逻辑,它以某种方式得到了服务3&#34;及其相应的金额。

XSL代码:

servtypes

XML示例

<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>


问题在于,无论何时循环遍历不同的服务值,它还会为每个不匹配的服务创建表行,并且单元格包含空白值,请参见下表。
如何防止创建空白行和单元格,只创建一个其值仅与Service 3相匹配的表?

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

我能够让这项工作检查下面的xsl。
解决方案

<table>
<tr>
 <td>Blank</td>
 <td>Blank</td>
 <td>Blank</td>
</tr>
<tr>
 <td>Blank</td>
 <td>Blank</td>
 <td>Blank</td>
</tr>
<tr>
 <td>Service 3</td>
 <td>Service Value</td>
 <td>Service</td>
</tr>
</table>

1 个答案:

答案 0 :(得分:2)

解决方案很简单:与您不需要的不匹配!

在下面的代码中,我将匹配表达式放在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>