为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法计入 Go 模板?

有没有办法计入 Go 模板?

Go
繁星coding 2022-06-27 10:54:46
我正在尝试为 epub 创建一个 toc.ncx (只是一个 XML)文件。在这样的目录中,<navpoint>定义了 s,每个都有一个 id 和一个“播放顺序”。Go模板有什么方法可以简单地计算导航点吗?我想过这样的事情(非工作模板代码){{$counter := 0}}{{define "NAVPOINT"}}  {{$counter = $counter + 1}}  <navpoint id="{{.}}" playorder="{{$counter}}">{{end}}{{range .TopLevel }}  {{template "NAVPOINT" .Id}}  {{range .SecondLevel }}    {{template "NAVPOINT" .Id}}    </navpoint>  {{end}}  </navpoint>{{end}}示例结构  { TopLevel: [      {         Id: "id-a"        SecondLevel: [          {            Id: "scnd-a"          }          {            Id: "scnd-b"          }        ]      }      {         Id: "id-b"        SecondLevel: [          {            Id: "scnd-c"          }          {            Id: "scnd-d"          }        ]      }    }这会给我这样的东西  <navpoint id="id-a"      playorder="1">     <navpoint id="scnd-a" playorder="2"></navpoint>     <navpoint id="scnd-b" playorder="3"></navpoint>  </navpoint>  <navpoint id="id-b"      playorder="4">     <navpoint id="scnd-c" playorder="5"></navpoint>     <navpoint id="scnd-d" playorder="6"></navpoint>  </navpoint>我想我可以使用模板功能,而不是模板来实现这一点,但不知道如何实现这一点。模板函数可以有计数器吗?
查看完整描述

1 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

这是我现在使用的功能:


"navpoint": func() func(...string) string {

    i := 0

    return func(id ...string) string {

        if len(id) < 1 {

            return "</navPoint>"

        }

        i++

        return `<navPoint id="` + id[0] + `" playorder"` + strconv.Itoa(i) + `">`

    }

},

我在模板中以这种方式使用它:


{{$navpoint := navpoint}}

{{range .TopLevel }}

  {{call $navpoint .Id}}

  {{range .SecondLevel }}

    {{call $navpoint .Id}}

    {{call $navpoint}}

  {{end}}

  {{call $navpoint}}

{{end}}

如果使用 id (XX) 调用“navpoint”,它会给出开始标签<navpoint id="XX" playorder="##">。在没有 id 的情况下调用时,它会给出结束标签</navpoint>


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信