Во-первых, этот шаблон никогда не соответствует:
<xsl:template match="*[starts-with(local-name(), 'MAINS/MAIN')]">
Это потому, что ни одно NCName не может иметь символ '/'
.
Во-вторых, эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*"/>
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="MAINS">
<xsl:copy>
<xsl:apply-templates select="*[not(self::MAIN)]" />
<xsl:apply-templates select="MAIN" />
</xsl:copy>
</xsl:template>
<xsl:template match="SUBMAINS">
<xsl:copy>
<xsl:apply-templates select="*[not(self::SUBMAIN)]" />
<xsl:apply-templates select="SUBMAIN" />
</xsl:copy>
</xsl:template>
<xsl:template match="MAIN|SUBMAIN">
<xsl:variable name="position">
<xsl:number/>
</xsl:variable>
<xsl:element name="{local-name()}{$position}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Вывод:
<?xml version="1.0" encoding="UTF-8"?>
<TEST>
<TAG1>
xyz
</TAG1>
<MAINS>
<MAIN1>
<DAT>abc</DAT>
<SUBMAIN1>
<DAT2>123</DAT2>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>456</DAT2>
</SUBMAIN2>
</MAIN1>
<MAIN2>
<DAT>pqr</DAT>
<SUBMAIN1>
<DAT2>123</DAT2>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>789</DAT2>
</SUBMAIN2>
</MAIN2>
<MAIN3>
<DAT>mno</DAT>
</MAIN3>
</MAINS>
<SUBMAINS>
<SUBMAIN1>
<DAT2>789</DAT2>
<DAT3>sfsfd</DAT3>
</SUBMAIN1>
<SUBMAIN2>
<DAT2>789</DAT2>
<DAT3>dsdsd</DAT3>
</SUBMAIN2>
</SUBMAINS>
</TEST>
Примечание: два правила для переупорядочения MAINS
и SUBMAINS
потомков, одно правило для перечисления элементов MAIN
и SUBMAIN
в заказеони были «выдвинуты».
Приложение: перечислять имена элементов не очень хорошая идея, потому что почти ни один словарь SGML / XML не использует этот для братьев и сестер (заголовок в HTMLявляются исключением, но они моделируют иерархию по линейному тексту)
EDIT : есть причина, потому что мне не нравится стиль push, и это связано с контекстом (текущий узел, текущий контекстный список, текущая позиция). Иногда это делает ошибку кода неразрешимой. Для «детерминированной» нумерации используйте xsl:number
.