Здравствуйте, 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>Ну, как оно работает, понятно. Как писать шаблоны при такой архитектуре — вот это очень непонятно ;(
Ага, по началу сложно.