我有一种情况,我需要在具有格式的对象属性列表上使用包装和锚定功能。
我可以在字符串模板中创建一个列表,然后去掉空值,如果它们只是直接的属性访问。但是我希望能够有条件地格式化一些属性。例如,给定模板。
PrintItem(item) ::= <<
<item.Count> <strip([item.Name, item.Value, PrintVat(item.Vat), item.Id]); separator=""\n"", anchor>
>>
PrintVat(vat) ::= "<if(vat)>Total VAT <vat><endif>"
和一个带有值的对象
Count = 2
Name = Tasty Chicken
Value = £100
Vat = £20
Id = 1
会产生
2 Tasty Chicken
£100
Total VAT £20
1
如果我传递了相同的对象,但 Value 的值为空,它将产生
2 Tasty Chicken
Total VAT £20
1
因为 strip 删除了空值。但是,如果我通过 Vat 的空值的第一个对象,那么我得到
2 Tasty Chicken
£100
1
因为模板总是解析为空字符串。那么有什么办法可以将空字符串转换为 null 吗?
此处明显的解决方法 StringTemplate 3: how to filter a list? 不起作用,因为它会在模板上引发编译异常。具体来说,它不喜欢“无”作为地图的价值。如果我可以像在那篇文章中那样将一个值显式映射为 null,那么我将拥有我需要的东西。