стандарт для "петель" в XML? - PullRequest
       10

стандарт для "петель" в XML?

3 голосов
/ 12 августа 2010

Я создаю простой 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 ]

2 голосов
/ 12 августа 2010

Проблема в том, что идея заключается в том, что «цикл» может означать так много разных вещей.

На процедурном языке достаточно ясно, что цикл означает, что вы что-то делаете, а затем вы (возможно) делаете это снова. На процедурном языке уже будет возможность выразить, как выражается «сделать что-то».

В декларативном языке, который XML более подходит для выражения, более нормально иметь «для всех», чем цикл как таковой, хотя люди часто говорят о XSLT для каждого, как будто это петля.

Как процедурные, так и декларативные (и другие) языки могут использоваться для выполнения тех повторяющихся задач, о которых вы здесь говорите, но прямое включение их в саму разметку беспорядочно смешивает домены, если это не имеет смысла с точки зрения разметка выражает объявление в ней «проходного» или «для каждого из них».

Ваш первый XML-файл представляет собой описание фреймов, а второй - описание того, что делать с фреймами. Это отдельные вещи, и смешивать их вместе чревато.

2 голосов
/ 12 августа 2010

XML - это данные, а не инструкции.Если вам нужна какая-то инструкция в xml, тогда создайте данные.Вы можете изменить свою структуру данных следующим образом:

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

В основном ваш второй подход.

2 голосов
/ 12 августа 2010

Универсальной модели не существует, но то, что вы ищете, - это, по сути, шаблонное решение - язык шаблонов и механизм оценки шаблонов, который преобразует шаблон в окончательный XML-код, выполняя код, встроенный в шаблон.

Таким образом, вы можете выбрать для модели ЛЮБОЙ язык шаблонов, с которым вы знакомы.

Самый лучший подход - это, конечно, использовать существующее решение шаблонизатора, если у вас есть доступ к нему;так что вам не нужно писать один.Например, JSP для Java, EmbPerl для Perl, XSLT и т. Д. *

Вот как будет выглядеть пример шаблона EmbPerl:

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

Многие шаблонные решения будут выглядеть очень похожими, снемного другая разметка и явно другой логический синтаксис (Perl против Java против xxx)


Если вы используете homebrew-решение, языком шаблонов, конечно, может быть сам 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 голос
/ 12 августа 2010

Вы можете использовать XSLT, который конвертирует ваш XML в нужный формат.

Особенно для вашего примера <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 здесь

0 голосов
/ 12 августа 2010

Вы можете использовать XSLT для достижения этой цели, но для этого требуется механизм преобразования. Многие из них есть (в том числе в большинстве браузеров, например). При необходимости вы можете включить объявление transform в директиву предварительной обработки данного документа.

(Это зависит от контекста, в котором вы используете ваши XML-документы.)

0 голосов
/ 12 августа 2010

Помните, что программа будет читать XML, а не человек.Программу нужно будет протестировать и поддерживать.

Чем сложнее вы добавите в свой формат XML, тем сложнее будет протестировать и поддерживать код, который его использует.

Другими словами, оставьте «цикл» в покое и просто придерживайтесь основ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...