这应该是一个简单的问题,但是在一些实验中我没有运气。
我正在使用XSLT将XML转换为CSV。我将关键输出元素定义为变量,因此-
<xsl:variable name="sep" select='"	"' />
<xsl:variable name="crlf" select='" "' />
<xsl:variable name="lf" select='" "' />
输入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元素的字面体中起作用,但这也不起作用。
答案 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的语法。由于您正在输出文本,因此与您的情况完全无关。