Я использовал некоторый код на форуме, чтобы обернуть несколько дочерних узлов в узле, но сейчас я изо всех сил пытаюсь получить заголовок в корневой узел.Вот пример xml, который я хочу преобразовать:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<A>
<B>
<C>stuff</C>
<D>stuff1</D>
<E>stuff2</E>
</B>
<B>
<C>stuff3</C>
<D>stuff4</D>
<E>stuff5</E>
</B>
</A>
, и это то, что мне нужно:
<?xml version="1.0"?>
<A>
<H>heading</H>
<B>
<C>stuff</C>
<ExtraInfo>
<D>stuff</D>
<E>stuff2</E>
</ExtraInfo>
</B>
<B>
<C>stuff3</C>
<ExtraInfo>
<D>stuff4</D>
<E>stuff5</E>
<ExtraInfo>
</B>
</A>
Это xsl, который я использую:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="B/*"/>
<xsl:template match="B/C">
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="B/*[not(self::C )][1]">
<ExtraInfo>
<xsl:apply-templates select="D/*"
mode="ExtraInfo"/>
<D><xsl:value-of select="//D"/></D>
<xsl:apply-templates select="E/*"
mode="ExtraInfo"/>
<E><xsl:value-of select="//E"/></E>
</ExtraInfo>
</xsl:template>
<xsl:template match="B/*" mode="ExtraInfo">
<xsl:call-template name="identity"/>
</xsl:template>
</xsl:stylesheet>
и вот результат:
<?xml version="1.0" ?>
- <A>
- <B>
<C>stuff</C>
- <ExtraInfo>
<D>stuff1</D>
<E>stuff2</E>
</ExtraInfo>
</B>
- <B>
<C>stuff3</C>
- <ExtraInfo>
<D>stuff1</D>
<E>stuff2</E>
</ExtraInfo>
</B>
</A>
Если я пытаюсь вставить шаблон для корневого узла, я получаю сообщение об ошибке, сообщающее, что у меня не может быть двух элементов более высокого уровня или некоторыхнапример.Как я могу вставить заголовок?