Валиков Алексей Н.
Шрифт:
Пример
Представим себе два простых преобразования,
first.xsl
и second.xsl
, первое из которых заменяет во входящем документе элементы а
на элементы b
, а второе — элементы b
на элементы с
. Листинг 10.13. Преобразование first.xsl
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="a">
<b>
<xsl:apply-templates select="@*|node"/>
</b>
</xsl:template>
<xsl:template match="@*|node">
<xsl:copy>
<xsl:apply-templates select="@*|node"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Листинг 10.14. Преобразование second.xsl
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="b">
<c>
<xsl:apply-templates select="@*|node"/>
</c>
</xsl:template>
<xsl:template match="@*|node">
<xsl:copy>
<xsl:apply-templates select="@*|node"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Для того чтобы последовательно применить два этих преобразования к некоторому входящему документу
a.xml
, мы можем, например, дважды вызвать процессор: java org.apache.xalan.xslt.Process -IN a.xml -XSL first.xsl -OUT b.xml
java org.apache.xalan.xslt.Process -IN b.xml -XSL second.xsl -OUT c.xml
В результате этих вызовов XSLT-процессор Xalan сначала применит преобразование
first.xsl
к документу a.xml
и сохранит результат в файле b.xml
, а затем обработает полученный документ b.xml
при помощи преобразования second.xml
и сохранит результат в файле c.xml
. В качестве альтернативы, например, для тех случаев, когда пакетная обработка невозможна, мы можем создать преобразование, последовательно применяющее шаблоны преобразований
first.xsl
и second.xsl
к входящему документу. Для этого: □ назначим шаблонам преобразования
first.xsl
режим first
, а шаблонам преобразования second.xsl
— режим second
; □ в основном шаблоне применим шаблоны режима
first
к узлам входящего документа, сохранив результат в переменной b
; □ приведем результирующее дерево, содержащееся в переменной
b
ко множеству узлов; □ обработаем полученное множество узлов шаблонами режима
second
. Следующий листинг демонстрирует предложенный подход.
Листинг 10.5. Преобразование first-then-second.xsl
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan">
<!-- Шаблоны преобразования first -->
<xsl:template match="a" mode="first">
<b>
<xsl:apply-templates select="@*|node" mode="first"/>
</b>
</xsl:template>
<xsl:template match="@*|node" mode="first">
<xsl:copy>
<xsl:apply-templates select="@*|node" mode="first"/>
</xsl:copy>
</xsl:template>
<!-- Шаблоны преобразования second -->