2010-08-11 54 views
3

我正在为动画设计一个简单的XML文件。我经常遇到这样的情况,我写这样的东西: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> 

使计数器变量占位符#。 我在想什么:有没有一种标准化的方式来做这样的事情? 如果使用人们已经习惯的方法,它只会让事情变得更容易。

谢谢!

回答

2

有没有通用的模式,但是你要找什么本质上是一个模板解决方案 - 一个模板语言加上一个模板评估引擎通过执行模板中嵌入的代码将模板转换为最终的XML。

因此,您可以对模型采取您熟悉的任何模板语言。

最好的方法当然是利用现有的模板引擎解决方案,如果您有权访问;所以你不必写一个。例如。 JSP为Java,EmbPerl为Perl,XSLT等..

下面是一个示例EmbPerl模板会是什么样子:

[$ foreach my $i (1..5) $] 
<frame> 
    <image>./image[+$i+].png<image/> 
</frame> 
[$ endforeach $] 

很多模板解决方案看起来非常相似,略有不同的标记,显然不同的逻辑语法(Perl中对Java的主场迎战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> 
0

请记住,一个程序将读取XML,而不是一个人。该计划将需要进行测试,并且需要进行维护。

您添加到XML格式的复杂性越高,测试和维护使用它的代码就越困难。

换句话说,单独留下“for循环”,只是坚持基本知识。

0

您可以使用XSLT来实现这一点,但这需要一个转换引擎。他们中的很多人(例如在大多数浏览器中)。如果需要,可以将变换声明包含在给定文档的预处理指令中。

(这取决于你用你的XML文档的内容。)

2

XML是数据而不是指令。如果你在xml中需要一种指令,那么创建它的数据。你可以像这样改变你的数据结构:

<frameset> 
<start>1</start> 
<end>3</end> 
<prefix>./image</prefix> 
<suffix>.png</prefix> 

基本上你的第二种方法。

1

您可以使用将您的XML转换为所需格式的XSLT。

Espesially你的榜样<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

2

的问题,这是想法是“循环”可以意味着很多许多不同的事情。

在过程语言中,足够清楚的是循环意味着你做了一些事情,然后你(可能)再次这样做。程序语言已经有了表达“如何做”的表达方式。

在一种声明式语言中,哪种XML更适合于表达,对于所有这些而言,比循环更普遍,尽管人们经常谈论XSLT的每一个就好像它是一个循环。

程序语言和声明性语言(以及其他语言)都可以用来执行您在此讨论的重复性任务,但将其直接插入标记本身会混淆混淆域,除非它在某些方面有意义标记表示要在其中声明“循环通过”或“对其中的每一个”。

您的第一个XML文件是对帧的描述,第二个是对帧的描述。这些是独立的东西,将它们混合在一起是充满了挑战的。