我有两个这样的元素:
<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以处理这样的情况?
答案 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/>
- 如果空虚是唯一的问题,它会很有用