1

我有两个这样的元素:

<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)"/>

但是当元素为空时,上面的字符串长度函数返回 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 以处理此类情况?

4

2 回答 2

1

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

在第一个示例中,这仅在您的元素为空时才有效。当长度大于 0 时,您提取的字符更少。如果字段的长度为 12,则您只能从 12 到 71 或 59 个字符中提取

在第二个中,您要附加 71 个空格,但您的子字符串仅从 char 12 到 71 中提取。71-12 = 59。因此,您再次只能获得 59 个字符。

这可能是你想要的:

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

不同之处在于省略了子字符串的最后一个参数,因此您可以拉到最后一个字符,而不仅仅是 char 71。

于 2018-06-18T18:46:54.753 回答
-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/>-如果空虚是唯一的问题,这很有用

于 2014-09-04T14:43:10.670 回答