XML中“循环”的标准?

时间:2010-08-11 20:14:12

标签: xml loops

我正在为动画设计一个简单的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>

将#作为计数器变量的占位符。 我想知道的是:已经有一种标准化的做法吗? 如果使用人们已经习惯的方法,它会让事情变得更容易。

谢谢!

6 个答案:

答案 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文档的上下文。)