XSL / FO值替换

时间:2015-07-30 14:31:57

标签: xml pdf xslt

如果这是基本的,那么道歉,但我刚刚接受了这个需要快速修复的问题。

我们正在从xml表单生成pdf,需要对值进行一些替换以在pdf中显示。

xml的部分看起来像这样

<c_child>
        <c_child_status/>
        <c_child_id>400044</c_child_id>
        <c_dob>2012-09-19</c_dob>
        <c_gender>M</c_gender>
        <c_forename>fred</c_forename>
        <c_surname>bloggs</c_surname>
    </c_child>

在当前的xsl / fo中,它使用以下内容插入性别值

<fo:table-cell border-style="inset" border-width="1pt" padding="2pt" background-repeat="repeat" display-align="center">
        <fo:block>
            <xsl:value-of select="//c_child/c_child_id"/>
        </fo:block>
</fo:table-cell>

我需要做的是测试性别值,如果M我要插入MALE,F然后将FEMALE插入到最终的PDF中。

我玩过xsl:if测试等,但是XSL被认为是有效的,它没有进行转换。

任何帮助表示赞赏

Redbyte

1 个答案:

答案 0 :(得分:0)

如果您正在使用XSLT 2.0,则可以直接在选择中添加if语句...

<xsl:value-of select="if (//c_child/c_gender = 'M') then 'MALE' else 'FEMALE'"/>

如果您正在使用XSLT 1.0,我会做的是将xsl:value-of替换为xsl:apply-templates并添加模板以处理c_gender/text() ...

替换xsl:apply-templates

<xsl:apply-templates select="//c_child/c_gender"/>

xsl:template

<xsl:template match="c_gender[.='M']/text()">
    <xsl:text>MALE</xsl:text>
</xsl:template>

<xsl:template match="c_gender[.='F']/text()">
    <xsl:text>FEMALE</xsl:text>
</xsl:template>    

它很冗长,但很容易管理imo。您还可以使用xsl:choose而不是两个单独的模板。 xsl:choose可以位于单独的模板中,也可以直接放在fo:table-cell中(替换xsl:value-of)...

<xsl:template match="c_gender/text()">
    <xsl:choose>
        <xsl:when test=".='M'">
            <xsl:text>MALE</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <xsl:text>FEMALE</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>