Эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:m="message" exclude-result-prefixes="m">
<m:header>
<m:message type="E">Wrong value</m:message>
<m:message type="E">Missing value</m:message>
<m:message type="W">Value too small</m:message>
</m:header>
<m:box>
<m:message type="E">Box too small</m:message>
<m:message type="W">Box flaps off center</m:message>
</m:box>
<m:wrapping>
<m:message type="E">Wrong material</m:message>
<m:message type="E">Prefer different color</m:message>
</m:wrapping>
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="path"/>
<xsl:template match="errors|warnings|issue">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="message">
<xsl:element name="{local-name(../../..)}Msg">
<type>
<xsl:value-of select="document('')/*/m:*[local-name()=local-name(current()/../../..)]/*[.=current()]/@type"/>
</type>
<msgText>
<xsl:value-of select="."/>
</msgText>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Вывод:
<x12errors>
<header>
<headerMsg>
<type>E</type>
<msgText>Wrong value</msgText>
</headerMsg>
<headerMsg>
<type>E</type>
<msgText>Missing value</msgText>
</headerMsg>
<headerMsg>
<type>W</type>
<msgText>Value too small</msgText>
</headerMsg>
</header>
<boxes>
<box>
<boxName>cardboard</boxName>
<boxStyleNum>12345</boxStyleNum>
<boxMsg>
<type>E</type>
<msgText>Box too small</msgText>
</boxMsg>
<boxMsg>
<type>W</type>
<msgText>Box flaps off center</msgText>
</boxMsg>
<wrappings>
<wrapping>
<material>bubble wrap</material>
<dimensions>9x12</dimensions>
<wrappingMsg>
<type>E</type>
<msgText>Wrong material</msgText>
</wrappingMsg>
<wrappingMsg>
<type>E</type>
<msgText>Prefer different color</msgText>
</wrappingMsg>
</wrapping>
</wrappings>
</box>
</boxes>
</x12errors>
РЕДАКТ. 1 : лучшее объяснение. Примечание : «Идентификационное преобразование» (шаблон [@ name = 'idenity']) просто копирует исходный источник как есть.Некоторые элементы обойдены (не копируйте, а применяйте шаблоны к дочерним элементам): errors
, warnings
и issue
.path
элемент чередуется с пустым шаблоном.Встроенная карта: document('')
вычисление в корне документа таблицы стилей;элементы верхнего уровня в другом пространстве имен, чем пространство имен XSLT, игнорируются процессором, но мы можем выбрать их (в этом случае те, которые имеют локальное имя, равное message
локальному имени деда, затем потомки из тех, которые имеютстроковое значение, равное message
строковое значение, и, наконец, их type
атрибут)