我正在为动画设计一个简单的XML文件。我经常遇到这种情况,我写的是这样的:
<frame>
<image>./image1.png<image/>
</frame>
<frame>
<image>./image2.png<image/>
</frame>
<frame>
<image>./image3.png<image/>
</frame>
...
现在,这当然会让人讨厌。所以我想我会允许这样做:
<frameset min=1 max=5>
<image>./image#.png<image/>
</frameset>
将#作为计数器变量的占位符。 我想知道的是:已经有一种标准化的做法吗? 如果使用人们已经习惯的方法,它会让事情变得更容易。
谢谢!
答案 0 :(得分:2)
没有通用模型,但您正在寻找的本质上是一个模板解决方案 - 模板语言和模板评估引擎,通过执行模板中嵌入的代码将模板转换为最终XML。
因此,对于模型,您可以采用您熟悉的任何模板语言。
当然,最好的方法是利用现有的模板引擎解决方案,如果您可以访问一个;所以你不必写一个。例如。 JSP for Java,EmbPerl for Perl,XSLT等......
以下是EmbPerl模板示例的样子:
[$ foreach my $i (1..5) $]
<frame>
<image>./image[+$i+].png<image/>
</frame>
[$ endforeach $]
许多模板解决方案看起来非常相似,标记略有不同,逻辑语法明显不同(Perl vs. Java vs. xxx)
如果你使用自制软件解决方案,模板语言当然可以是XML本身,比如
<frameset min=1 max=5>
<image part=1 conent_type="constant">./image<image/>
<image part=2 conent_type="iterator_value"><image/>
<image part=3 conent_type="constant">.png<image/>
</frameset>
答案 1 :(得分:2)
XML是数据而不是指令。如果你需要在xml中有一种指令,那就把它作为数据。您可以像这样更改数据结构:
<frameset>
<start>1</start>
<end>3</end>
<prefix>./image</prefix>
<suffix>.png</prefix>
基本上是你的第二种方法。
答案 2 :(得分:2)
问题在于,“循环”可能意味着许多不同的东西。
在程序语言中,很明显循环意味着你做某事然后你(也许)再做一次。程序语言已经有了表达如何表达“做某事”的方式。
在一种声明性语言中,哪种XML更适合表达,拥有“为所有这些”而不是循环本身更为正常,尽管人们经常谈论XSLT for-each就好像它是一个循环。
程序语句和声明语言(以及其他语言)都可用于执行您在此处讨论的那种重复性任务,但将其直接放入标记本身会混乱使用域,除非它在什么方面有意义标记表示在其中声明“循环”或“为每个”。
你的第一个XML文件是帧的描述,第二个是关于帧的描述。这些都是分开的东西,将它们混合在一起是很充实的。
答案 3 :(得分:1)
您可以使用将您的XML转换为所需格式的XSLT。
对于您的示例<frameset min=1 max=5>
,您可以使用此XSLT示例
<xsl:template match="iframe">
<xsl:variable name="from" select="./@min"/>
<xsl:variable name="to" select="./@max"/>
--> loop from the ${from} to the ${to} variable,
</xsl:template match="iframe">
可以找到XSLT技术中的循环here
答案 4 :(得分:0)
请记住,程序将读取XML而不是人类。该程序需要进行测试,并且需要进行维护。
您添加到XML格式的复杂性越高,测试和维护使用它的代码就越难。
换句话说,单独留下“for loop”,并坚持使用基础知识。
答案 5 :(得分:0)
您可以使用XSLT来实现此目的,但这需要转换引擎。其中许多都在附近(例如在大多数浏览器中)。如果需要,可以在给定文档的预处理指令中包含转换声明。
(这取决于您使用XML文档的上下文。)