即使元素为空,也使用前导空格填充xslt 1.0中的字符串值

时间:2014-09-04 14:34:26

标签: xml xslt-1.0 padding fixed-width msxml6

我有两个这样的元素:

<PhoneNumber>0870 6071352</PhoneNumber>
<FaxNumber>01722 422301</FaxNumber>

在输出(固定宽度文本)中,这两个都需要用前导空格填充,长度为71个字符

所以我试过了:

<xsl:value-of select="substring(concat('                                                                       ', msg:ContactDetails/msg:PhoneNumber), string-length(msg:ContactDetails/msg:PhoneNumber) + 1, 71)"/>
<xsl:value-of select="substring(concat('                                                                       ', msg:ContactDetails/msg:FaxNumber), string-length(msg:ContactDetails/msg:FaxNumber) + 1, 71)"/>

但是当元素为空时,上面的 string-length 函数返回0,所以我的输出中只有59个空格而不是71个。

我也尝试过:

<xsl:value-of select="substring(concat('                                                                       ', msg:ContactDetails/msg:PhoneNumber), 12, 71)"/>
<xsl:value-of select="substring(concat('                                                                       ', msg:ContactDetails/msg:FaxNumber),  12, 71)"/>

但是当FaxNumber或Phonenumber元素为空时会发生同样的事情

如何更改我的xsl以处理这样的情况?

2 个答案:

答案 0 :(得分:1)

[回答这篇旧帖子,因为我在搜索中偶然发现它并且没有明确答案]

在第一个示例中,仅当元素为空时才会起作用。当长度> 0时,你拉的字符越少。如果该字段的长度为12,则仅从12到71或59个字符拉

在第二个中你附加了71个空格,但你的子串仅从第12个字符到第71个字段.71-12 = 59.所以你只能得到59个字符。

这可能是你想要的:

<xsl:value-of select="substring(concat('                                                                       ', msg:ContactDetails/msg:PhoneNumber), string-length(msg:ContactDetails/msg:PhoneNumber) + 1)"/>

不同之处在于离开了子串的最后一个参数,因此您将拉到最后一个char,而不仅仅是char 71。

答案 1 :(得分:-2)

在XSLT术语中,您有两个不同的来源(填充元素和空元素),因此您不必使用硬编码函数来修复它。你必须修复XSLT风格。

1)模板 - 如果您不仅有2个变体,而且许多变体具有不同的约束

,这将非常有用

a)使用<xsl:apply-templates select="msg:PhoneNumber | msg:FaxNumber" mode="formatted">

b)和两个不同的模板<xsl:template match="msg:PhoneNumber | msg:FaxNumber" mode="formatted" >和类似<xsl:template match="msg:PhoneNumber[string(.)=''] | msg:FaxNumber[string(.)='']" mode="formatted" >的东西 - 第二个将获得更高的优先级

2)老朋友<xsl:if /><xsl:choose/> - 如果空虚是唯一的问题,它会很有用