xslt-插值紧邻的多个变量

时间:2019-02-28 19:14:30

标签: xml xslt

这应该是一个简单的问题,但是在一些实验中我没有运气。

我正在使用XSLT将XML转换为CSV。我将关键输出元素定义为变量,因此-

<xsl:variable name="sep" select='"&#9;"' />
<xsl:variable name="crlf" select='"&#13;&#10;"' />
<xsl:variable name="lf" select='"&#10;"' />

输入XML看起来像这样-

<unit>
    <def>60 s</def>
    <name><singular>minute</singular></name>
    <symbol>min</symbol>
    <definition>period of time equal to 60 seconds</definition>
</unit>

有些单位既有单数名称又是复数名称,有些单位只有一个,而有些则没有名称(奇怪,但这就是我要处理的)。

当我检测到一个没有<name>元素的单元时,我需要将两个空列(两个分隔符)输出到CSV。

在XSLT的这段代码中

    <xsl:choose>
        <xsl:when test="name">
            <xsl:apply-templates select="name" />
            <xsl:value-of select="$sep" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$sep" />
            <xsl:value-of select="$sep" />
        </xsl:otherwise>
    </xsl:choose>

具有两个单独的<xsl:value-of select="$sep" />语句可以正常工作,但是看起来很冗长。有没有更整齐的方法?

使用<xsl:value-of select="$sep$sep" />不起作用。直接在else子句中或嵌入xsl:text元素中也不会使用$sep$sep

XSLT解析器是否太有限而无法将多个变量内插到字符串中?还是我缺少一种表达方式?

-更新- 我对各种xslt指南的阅读表明,语法{$sep}{$sep}应该在xsl:match元素的字面体中起作用,但这也不起作用。

1 个答案:

答案 0 :(得分:0)

  

有两个单独的语句可以工作,但是看起来很冗长。有没有更整齐的方法?

正如我在对您的问题的评论中提到的那样,您可以使用:

<xsl:value-of select="concat($sep, $sep)" /> 

但是,这并没有获得真正的优势。相反,它使代码的可读性降低-某些代码(包括我)会说它在写入输出之前添加了不必要的计算。

恕我直言,简化代码的更好方法是:

<xsl:choose>
    <xsl:when test="name">
        <xsl:apply-templates select="name" />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$sep" />
    </xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$sep" />

因为第二个分隔符与条件无关。


  

-更新-我对各种xslt指南的阅读表明,语法{$sep}{$sep}应该在xsl:match元素的字面体中起作用,但这也不起作用。

获取更好的阅读材料。 {$sep}{$sep}attribute value template的语法。由于您正在输出文本,因此与您的情况完全无关。