В этом вопросе есть что-то странное: Я не вижу, как заголовок вашего вопроса соответствует содержанию .
В заголовке вы запрашиваете двухпроходное преобразование, при котором первый проход должен удалить атрибуты , а второй должен работать с ним.
В содержании вы показываете два шаблона, которые выводят локальное имя узлов и атрибутов, а после вы показываете в другом шаблоне, что вы хотите, чтобы работал с атрибутами , получая их значение ...:)
Согласно ответу @ Dimitre на содержание вашего вопроса (который, я думаю, не отвечает на реальный вопрос) Я постараюсь ответить на заголовок вашего вопроса, который кажется гораздо более интересным (и отвечающим).
Удаление атрибутов из XSLT ...
Чтобы удалить атрибуты (и получить преобразование без пространств имен), вы можете работать с Identity Transformation .Поскольку вы хотите многоходовую передачу, вы должны скопировать содержимое преобразования в переменную в первом проходе.
Вы можете использовать mode , чтобы адресовать процесс элементам в первом проходе.
... и работать с результатомset
Для работы с набором результатов (формально известный как фрагмент дерева результатов ) необходимо применить шаблоны с помощью ссылка на переменную, определенную в первом проходе .Добро пожаловать!Это второй проход:)
Двухпроходное преобразование относительно доступно в XSLT 2.0 по сравнению с XSLT 1.0 благодаря способности XSLT 2.0 применять шаблоны к RTF.В XSLT 1.0 вам потребуется специальная функция расширения, которая называется node-set()
.
XSLT 2.0 будет выглядеть следующим образом (чистый пример):
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="abc123"
version="2.0">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:variable name="FirstPass">
<xsl:copy>
<xsl:apply-templates select="/" mode="FirstPass"/>
</xsl:copy>
</xsl:variable>
<xsl:apply-templates select="$FirstPass/report/book/page"/>
</xsl:template>
<xsl:template match="node()" mode="FirstPass">
<xsl:element name="{local-name()}">
<xsl:apply-templates select ="node()" mode="FirstPass"/>
</xsl:element>
</xsl:template>
<xsl:template match="page">
<xsl:value-of select="count(@*)"/>
</xsl:template>
</xsl:stylesheet>
с результатами (применимо к вашему примеру ввода)
00
XSLT 1.0 будет выглядеть очень похоже, но корневой элемент преобразования:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="abc123"
xmlns:exslt="http://exslt.org/common"
version="2.0">
и второй проход :
<xsl:apply-templates select="exslt:node-set($FirstPass)/report/book/page"/>