XSLT 1.0 使用 IF 构建以换行符分隔的列表并删除最后一个换行符

XSLT 1.0 build newline-delimited list using IFs and remove last newline

XML 源中有数据,我想将其转换为一个由换行符分隔的列表并删除最后一个换行符。

这是我目前所拥有的...

XML

<pool>yes</pool>
<balcony>no</balcony>
<garage>yes</garage>

XSLT

<xsl:variable name="pool"><xsl:if test="pool='yes'"><xsl:text>Pool&#10;</xsl:text></xsl:if></xsl:variable>
<xsl:variable name="balcony"><xsl:if test="balcony='yes'"><xsl:text>Balcony&#10;</xsl:text></xsl:if></xsl:variable>
<xsl:variable name="garage"><xsl:if test="garage='yes'"><xsl:text>Garage&#10;</xsl:text></xsl:if></xsl:variable>
<xsl:variable name="features"><xsl:value-of select="concat($pool,$balcony,$garage)"/></xsl:variable>
<xsl:value-of select="$features"/>

此时我有:

Pool<newline>
Garage<newline>
blank line

我想删除最后一个换行符和空行。

有没有办法摆脱它,或者改变我将列表放在一起以生成列表的方式?

考虑以下示例:

XML

<features>
    <pool>yes</pool>
    <balcony>no</balcony>
    <garage>yes</garage>
</features>

XSLT 1.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />

<xsl:template match="features">
    <xsl:for-each select="*[.='yes']">
        <xsl:value-of select="name()"/>
        <xsl:if test="position()!=last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

结果

pool
garage

按照您的方式进行,您可以简单地删除最后一个换行符:

<xsl:template match="features">
    <xsl:variable name="pool">
        <xsl:if test="pool='yes'">
            <xsl:text>Pool&#10;</xsl:text>
        </xsl:if>
    </xsl:variable>
    <xsl:variable name="balcony">
        <xsl:if test="balcony='yes'">
            <xsl:text>Balcony&#10;</xsl:text>
        </xsl:if></xsl:variable>
    <xsl:variable name="garage">
        <xsl:if test="garage='yes'">
            <xsl:text>Garage&#10;</xsl:text>
        </xsl:if>
    </xsl:variable>
    <xsl:variable name="features" select="concat($pool, $balcony, $garage)"/>
    <xsl:value-of select="substring($features, 1, string-length($features) - 1)"/>
</xsl:template>