Re[9]: Помогите с xslt-преобразованием плс
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 17.11.10 00:40
Оценка:
Здравствуйте, Marty, Вы писали:

M>>>Последний вопрос. Как сделать множественную обработку одного и того же узла? Проверить одно условие, модифицировать, проверить другое, снова модифицировать.

R>>Ага.
M>А поподробнее? Код, который я ниже привел, не работает, отрабатывает только последний шаблон.
M>Значит, надо все-таки как-то через xsl:if делать?
M>Не пойму как это записать. Однократно создать атрибут (с обновленным содержимым) могу, но не понимаю, как мне несколько раз изменить содержимое, хотя бы просто добавляя
Выше я вас неправильно понял. Несколько раз никак, это потоковая обработка: на момент записи в выходной поток вы должны принять окончательное решение в данном случае о значении атрибута.

M>
M><xsl:template match="/VisualStudioProject/Configurations/Configuration/Tool[@Name='VCCLCompilerTool']"> 
M><xsl:copy>
M>    <!-- Создаем базовое значение копированием исходного. А надо? -->
M>    <xsl:attribute name="PreprocessorDefinitions"><xsl:value-of select="attribute::PreprocessorDefinitions"/></xsl:attribute>
M>    <!-- Начинаем добавлять разные штуки -->
M>    <xsl:if> test="not(contains(@PreprocessorDefinitions,'_CRT_SECURE_NO_WARNINGS'))">
M>        <!-- Что тут написать, вот в чем вопрос -->
M>    </xsl:if>
M>    <xsl:if> test="not(contains(@PreprocessorDefinitions,'_CRT_SECURE_NO_DEPRECATE'))">
M>        ...
M>    </xsl:if>
M>    ...
M>    <!-- Обработать все прочие атрибуты как-то аналогично -->
M>    <xsl:copy-of select="@*[local-name() != 'PreprocessorDefinitions' and остальные уже обработанные ]"/>
M>    <xsl:apply-templates/>
M></xsl:copy> 
M></xsl:template>
M>

Определите на каждое определение препроцессора по переменной, значение которых определяйте с помощью xsl:if. В конце при определении атрибута в выходном потоке просто конкатенируйте значения всех переменных.

M>Вот это точно не работает, срабатывает только последнее.

Не, так не пойдет. Я же писал выше, что это потоковая обработка. Вот у вас и срабатывает только один шаблон из конкурирующих (возможно, срабатывают все, но результат записывается от последнего). Шаблоны нужны для обработки непересекающихся множеств элементов, а у вас из-за атрибута с определениями препроцессоров получилось пересечение.
M>
M><xsl:template 
M>     match="/VisualStudioProject/Configurations/Configuration/Tool[@Name='VCCLCompilerTool' and not(contains(@PreprocessorDefinitions,'_CRT_SECURE_NO_WARNINGS'))]"> 
M><xsl:copy>
M>    <xsl:attribute name="PreprocessorDefinitions"><xsl:value-of select="concat(attribute::PreprocessorDefinitions,';_CRT_SECURE_NO_WARNINGS')"/></xsl:attribute>
M>    <xsl:copy-of select="@*[local-name() != 'PreprocessorDefinitions']"/>
M>    <xsl:apply-templates/>
M></xsl:copy> 
M></xsl:template>

M><!-- Update defines - add macro _SCL_SECURE_NO_WARNINGS -->
M><xsl:template 
M>     match="/VisualStudioProject/Configurations/Configuration/Tool[@Name='VCCLCompilerTool' and not(contains(@PreprocessorDefinitions,'_SCL_SECURE_NO_WARNINGS'))]"> 
M><xsl:copy>
M>    <xsl:attribute name="PreprocessorDefinitions"><xsl:value-of select="concat(attribute::PreprocessorDefinitions,';_SCL_SECURE_NO_WARNINGS')"/></xsl:attribute>
M>    <xsl:copy-of select="@*[local-name() != 'PreprocessorDefinitions']"/>
M>    <xsl:apply-templates/>
M></xsl:copy> 
M></xsl:template>

M><!-- Update defines - add macro  -->
M><xsl:template 
M>     match="/VisualStudioProject/Configurations/Configuration/Tool[@Name='VCCLCompilerTool' and not(contains(@PreprocessorDefinitions,'_CRT_SECURE_NO_DEPRECATE'))]"> 
M><xsl:copy>
M>    <xsl:attribute name="PreprocessorDefinitions"><xsl:value-of select="concat(attribute::PreprocessorDefinitions,';_CRT_SECURE_NO_DEPRECATE')"/></xsl:attribute>
M>    <xsl:copy-of select="@*[local-name() != 'PreprocessorDefinitions']"/>
M>    <xsl:apply-templates/>
M></xsl:copy> 
M></xsl:template>
M>


M>>>к которому опять пробуется применить все шаблоны, и если ничего не подходит, то тогда обработка завершается?

R>>А вот это — нет. Обычная потоковая обработка: есть входной поток, есть выходной поток — преобразователь читает входной поток и пишет выходной поток. Иными словами выходной поток преобразователь не читает.
M>Ну, как оно работает, понятно. Как писать шаблоны при такой архитектуре — вот это очень непонятно ;(
Ага, по началу сложно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.