2009-02-24 3 views
2

У меня есть особая проблема. Я не уверен, как подойти. Здесь, в офисе, есть большой громоздкий XSLT, который мы имеем для адаптации одного типа XML к другому. Проблема в том, что он не очень последовательно написан и очень трудно следовать. В древнем создании этой таблицы стилей, кажется, было забыто точно, что он делает.Алгоритм сопоставления XSLT

Есть ли способ легко отобразить в удобном для восприятия формате то, что делает гигантский XSLT? т. е. каждый возможный вход -> каждый возможный выход. Мы не можем создать всеобъемлющий входной документ, так как адаптер имеет различное поведение для разных входных данных (мы оцениваем, что для покрытия каждого возможного выхода потребуется более 100 входных документов)

Любое предложение было бы очень желанным.

+0

Не совсем. XSLT рекурсивный по своей природе. – annakata

+0

Не весело. Я думаю, что нам действительно интересно: «Есть ли простой способ отобразить все вызовы шаблонов для гигантской таблицы стилей?» XSLT не поддается этому очень хорошо. –

ответ

1

Разбить его - переместите операторы выполнения xsl в шаблоны xsl внутри документа. Делая это, вы будете работать с более разумным пониманием документа сверху вниз.

И если это так невероятно гигантски, чтобы вас не понимали, это звучит так, будто перед вами впереди вас рефакторинг: этот документ настолько важен, что нам нужно знать, что он делает (и понять, как это происходит работы, что требует некоторой переделки), или мы можем жить с ним как есть?

0

Это не поможет вам, по всей вероятности. Но я поделюсь своим опытом.

Я относился к XSLT только вчера, когда у меня была такая же проблема, пытаясь выяснить, что спецификация XSLT говорит w.r.t. разбор. То, что я сделал, чтобы помочь себе, добавило несколько функций (xsl: template, быть педантичным) к исходному XSL. Затем я запустил его в браузере и вуаля, у меня была четкая картина DFS.

Я создал следующее:

<xsl:template name="print"> 
<xsl:param name="message"/> 
<xsl:param name="elem"/> 
<div class="ArticleBody"> 
    <br/> 
    <xsl:value-of select="$message"/>: <xsl:value-of select="$elem"/> ... <br/> 
</div> 

print шаблон рабочий, а пролог и эпилог просто вызывает print с пользовательскими строками.

И я положил изменяет исходный файл XSL из:

<xsl:template match="db:para"> 
<xsl:apply-templates/> 
</xsl:template> 

к:

<xsl:template match="db:para"> 
<xsl:call-template name="prologue"> 
    <xsl:with-param name="item" select="'para'"/> 
</xsl:call-template> 
<xsl:apply-templates/> 
<xsl:call-template name="epilogue"> 
    <xsl:with-param name="item" select="'para'"/> 
</xsl:call-template> 

я теперь получить выход, когда каждый узел был обработан:

start-processing: article ... 

и когда оно co mpleted

end-processing: article ... 

Я бросил в немного CSS, а также (при обработке корневого узла) просто так все выглядит хорошо. И этот вид сделал мой день :)

1

Вы понимаете свои входные документы?

Если да пропустить следующее предложение еще нет: -

Тогда вы не можете протестировать любой полученный переделан XSLT, следовательно, вы должны сделать ответ на этот вопрос, да.

Вы понимаете свои выходные документы?

Если да пропустить следующее предложение еще нет: -

Тогда вы не можете протестировать любой полученный переделан в XSLT, следовательно, вы должны сделать ответ на этот quesion, да.

Теперь, когда ответы на оба вопроса да, дайте XSLT и создайте что-то, что вы можете понять. Вы знаете, что такое вход, и вы знаете, какой результат вы хотите, классический фон-новоман (они все еще учат, что в наши дни?).

+0

Я должен согласиться, я хочу, чтобы дизайнер этого адаптера поделился лучшей документацией. –

1

Как правило, это невозможно для любого языка программирования!

Это следует из неразрешимости the halting problem.

Таким образом, вы можете приложить огромные усилия, пытаясь сделать что-то, что оказалось невозможным.

Моя рекомендация, чтобы написать собственное решение, следуя передовой практики программирования, с помощью модульных тестов и если возможные доказательства корректности. XSLT как функциональный язык лучше подходит для проверки правильности.

+0

Спасибо, что указали это. Это очень близко к проблеме Halting и объясняет, почему это кажется таким трудным. :-) –

+0

Это не всегда возможно, но это может быть возможно для конкретной программы. например. Привет мир. Также можно указать рекурсивное отображение между грамматиками (но это не для слабонервных без математического фона) и, следовательно, не очень читаемо для человека). – 13ren