Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 用XML使用Mustache模板_Templates_Mustache - Fatal编程技术网

Templates 用XML使用Mustache模板

Templates 用XML使用Mustache模板,templates,mustache,Templates,Mustache,我正在使用,但我想这个问题对于所有实现都是一样的 我正在使用Mustach生成一个XML文件。当列表为空时,我不希望显示父标记。当列表不为空时,我希望父标记显示一次。我想知道胡子模板应该是什么样子 例如,我可能有两个需要根据数据输入生成的XML文件: <class> <name>Basketweaving</name> <students> <student>Joe Smith</student&g

我正在使用,但我想这个问题对于所有实现都是一样的

我正在使用Mustach生成一个XML文件。当列表为空时,我不希望显示父标记。当列表不为空时,我希望父标记显示一次。我想知道胡子模板应该是什么样子

例如,我可能有两个需要根据数据输入生成的XML文件:

<class>
    <name>Basketweaving</name>
    <students>
        <student>Joe Smith</student> 
        <student>Sally Smithers</student>
    </students>
</class>

编篮
乔·史密斯
萨莉·史密瑟斯
或:


在不好的时候编织篮子
我遇到的问题是,如果我这样定义模板:

<class>
   <name>{{className}}</name>
   <students>
    {{#students}}
      <student>{{studentName}}</student>
    {{/students}}
   </students>
<class>

{{className}}
{{{学生}
{{studentName}
{{/学生}
然后空旷的班级仍然有一个学生区

e、 g


在不好的时候编织篮子
如果我移动循环:

<class>
   <name>{{className}}</name>
   {{#students}}
   <students>
      <student>{{studentName}}</student>
   </students>
   {{/students}}
<class>

{{className}}
{{{学生}
{{studentName}
{{/学生}
我将在第一个示例中重复学生:

e、 g


编篮
乔·史密斯
萨莉·史密瑟斯

那么,使用模板来获得所需行为的正确方法是什么呢?

我找到了自己问题的答案。使用JMustache时,模板应如下所示:

<class>
   <name>{{className}}</name>
   {{#students}}
   {{#-first}}<students>{{/-first}}
      <student>{{studentName}}</student>
   {{#-last}}</students>{{/-last}}
   {{/students}}
<class>

{{className}}
{{{学生}
{{{#-first}{{/-first}}
{{studentName}
{{{}-last}{{/-last}}
{{/学生}
-first和-last是特殊的标志,它们仅在循环的第一次或最后一次迭代中为真

因此,在学生循环中循环通过第一个条目时,上述代码将只输出
。同样地,
仅在学生循环输入期间输出


这意味着如果学生是一个空列表,
将永远不会输出,但是如果有一个或多个条目,条目将被
包围,使用项目中的
TemplateEncoder
类(我是作者),您可以执行以下操作:


{{className}}
{{?学生}
{{#.}}
{{studentName}
{{/.}}
{{/学生}
如果“students”存在且不为空,则将呈现标记之间的内容。否则,它将被忽略

“.”字符是一个自引用-在“students”块中,它指的是students集合本身


“?”不是“官方”胡须语法,但如果JMustache不是硬要求,则可能是一个选项。

我建议采用两种情况的方法:

  • 空或空的列表被简单地省略
  • 非空列表将与其元素一起呈现
  • 如何呈现空列表或空列表 Mustache's可能会出现“未找到任何内容”的情况(例如,错误消息或某些替代元素):

    {{^students}
    {{/学生}
    
    将提交给:

    
    
    但在你的情况下,你什么都不想要:

    {{^students}{{/students}
    
    如何呈现非空列表 “小胡子”将列出每个人的所有学生,姓名包装在
    集合中

    但是您只希望包装集合元素
    在列表中显示一次。然后,您可以根据所使用的模型数组或列表,测试length或size属性:

    {{{#students.length}
    {{{学生}
    {{studentName}
    {{/学生}
    {{/students.length}
    
    将导致这种情况,例如:

    
    乔·史密斯
    萨莉·史密瑟斯
    
    长度条件的灵感来自于对类似问题的当前热门/公认答案:

    把这两个案例放在一起 因此,我们将两个模板部分添加到外部
    根元素中,并始终显示子元素
    名称

    
    {{className}}
    {{{学生.长度}
    {{{学生}
    {{studentName}
    {{/学生}
    {{/students.length}
    {{^students}{{/students}
    
    好处:

    • 更清晰易读的模板
    • 这两个不同的案例是分开的,并进行了明确的沟通

    它可以用来生成XML属性吗?是的,它与输出的格式无关。它会在{{VAR}}的位置吐出值。多么大的变化啊!然后(2020年11月)推荐您的工具,最近您写了一篇关于XML模板快速胡子的优秀文章:DZone(2021年1月):@hc_dev您能详细介绍一下您的评论吗?这个建议是为了回答OP关于使用模板生成XML的问题。您提到的文章正好相反,它使用模板将XML转换为另一种表示形式。所以,你的回答暗示了另一种依赖,在我看来,这与此相去甚远。但我喜欢你们的胡子相关的文章,并希望鼓励你们提供一个使用胡子的答案。如果我的评论有误导性,很抱歉,谢谢。我更新了我的答案以澄清意图。我认为这比使用
    -first
    -last
    更清楚。
    <class>
       <name>{{className}}</name>
       {{#students}}
       <students>
          <student>{{studentName}}</student>
       </students>
       {{/students}}
    <class>
    
    <class>
        <name>Basketweaving</name>
        <students>
            <student>Joe Smith</student> 
        </students>
        <students>
            <student>Sally Smithers</student>
        </students>
    </class>
    
    <class>
       <name>{{className}}</name>
       {{#students}}
       {{#-first}}<students>{{/-first}}
          <student>{{studentName}}</student>
       {{#-last}}</students>{{/-last}}
       {{/students}}
    <class>