我正在使用JMustache,但我想这个问题对于所有实现都是一样的。
我正在使用Mustache生成XML文件。当列表为空时,我不希望显示父标记。当列表不为空时,我希望父标记显示一次。我想知道胡子模板应该是什么样子。
例如,我可能需要根据数据输入生成两个XML文件中的任何一个:
<class>
<name>Basketweaving</name>
<students>
<student>Joe Smith</student>
<student>Sally Smithers</student>
</students>
</class>
要么:
<class>
<name>Basketweaving at a bad time</name>
</class>
我遇到的问题是如果我像这样定义我的模板:
<class>
<name>{{className}}</name>
<students>
{{#students}}
<student>{{studentName}}</student>
{{/students}}
</students>
<class>
然后空课仍然有学生块。
EG
<class>
<name>Basketweaving at a bad time</name>
<students>
</students>
</class>
如果我移动循环:
<class>
<name>{{className}}</name>
{{#students}}
<students>
<student>{{studentName}}</student>
</students>
{{/students}}
<class>
我将在第一个例子中重复学生:
EG
<class>
<name>Basketweaving</name>
<students>
<student>Joe Smith</student>
</students>
<students>
<student>Sally Smithers</student>
</students>
</class>
那么,做模板以获得我想要的行为的正确方法是什么?
我找到了自己问题的答案。使用JMustache,模板应该类似于以下内容:
<class>
<name>{{className}}</name>
{{#students}}
{{#-first}}<students>{{/-first}}
<student>{{studentName}}</student>
{{#-last}}</students>{{/-last}}
{{/students}}
<class>
-first和-last是特殊标志,仅在循环的第一次或最后一次迭代时才为真。
因此,上面的代码只会输出<students>
,同时循环遍历学生循环中的第一个条目。同样,</students>
只会在学生循环输入期间输出。
这意味着如果学生是空列表,则永远不会输出<students> </students>
,但是如果有一个或多个条目,则条目将被<students> </students>
包围。