XSLT拼接字段并替换值至数据库单列的语法错误求助
问题与解决方案
我需要将数据源中值为"true"的四个字段(RNP_PARK、RNP_PARK2、RNP_PARK3、RNP_PARK4)拼接成数据库的单个列,用逗号分隔,同时将"true"替换为自定义名称。编写的XSL代码出现语法错误,提示'when()'是未知XSLT函数,尝试If和Choose也未解决问题。期望当所有字段值为true时,数据库NP_PARK列显示"Open, Beware Animals, National, Free"。尝试的代码如下:
<xsl:variable name="RNP_PARKS"> <xsl:value-of select="concat( when (RNP_PARK='true') then 'Open '', when (RNP_PARK2='true') then ', Beware Animals' otherwise '', when (RNP_PARK3='true') then ', National' otherwise '', when (RNP_PARK4='true') then ',Free '' )"/> </xsl:variable>
错误原因
- 不存在
when()这个XPath函数:你错误地把XSLT的<xsl:when>元素逻辑当成了可在concat()中调用的函数,不符合语法规范。 - 字符串引号语法错误:代码里的
'Open '',多了一个单引号,导致解析失败。 - 手动拼接逗号易出现冗余:比如开头或结尾多出逗号,处理起来繁琐。
正确解决方案
方案1:兼容XSLT 1.0的写法
用<xsl:if>逐个判断,同时处理逗号的显示逻辑:
<xsl:variable name="RNP_PARKS"> <!-- 第一个项,不需要前置逗号 --> <xsl:if test="RNP_PARK='true'">Open</xsl:if> <!-- 第二个项,只有前面有已选中项时才加逗号 --> <xsl:if test="RNP_PARK2='true'"> <xsl:if test="RNP_PARK='true'">,</xsl:if> Beware Animals </xsl:if> <!-- 第三个项,前面有任意已选中项时加逗号 --> <xsl:if test="RNP_PARK3='true'"> <xsl:if test="RNP_PARK='true' or RNP_PARK2='true'">,</xsl:if> National </xsl:if> <!-- 第四个项,前面有任意已选中项时加逗号 --> <xsl:if test="RNP_PARK4='true'"> <xsl:if test="RNP_PARK='true' or RNP_PARK2='true' or RNP_PARK3='true'">,</xsl:if> Free </xsl:if> </xsl:variable>
方案2:XSLT 2.0及以上的简洁写法
利用XPath 2.0的if表达式和string-join函数,自动处理逗号分隔,避免冗余:
<xsl:variable name="RNP_PARKS" select="string-join( ( if (RNP_PARK='true') then 'Open' else (), if (RNP_PARK2='true') then 'Beware Animals' else (), if (RNP_PARK3='true') then 'National' else (), if (RNP_PARK4='true') then 'Free' else () ), ', ' )"/>
这个写法会先收集所有值为true的字段对应的自定义名称,形成一个序列,再用string-join自动在项之间添加, 分隔符,完全不需要手动处理逗号的位置,更简洁可靠。
内容的提问来源于stack exchange,提问作者flea02
相关产品推荐
相关产品推荐

