У меня есть XML, у которого тип группы является самым глубоким узлом.Я должен сгруппировать подраздел XML, но в противном случае вернуть точно такой же XML.
Я смотрел на разные вопросы в Stackoverflow.В частности, я основываю свой ответ на этом: Группировка узлов XML по значению дочернего элемента в Xsl
Входной XML выглядит следующим образом:
<list>
<element>
<foo>
<bar>
</bar>
</foo>
<values>
<position>
<foo2>
</foo2>
<type>first
</type>
</position>
<position>
<foo2>
</foo2>
<type>second
</type>
</position>
<position>
<foo2>
</foo2>
<type>first
</type>
</position>
</values>
</element>
</list>
Выходной XML должен выглядеть следующим образом:
<list>
<element>
<foo>
<bar>
</bar>
</foo>
<types>
<first>
<values>
<position>
<foo2>
</foo2>
</position>
<position>
<foo2>
</foo2>
</position>
</values>
</first>
<second>
<values>
<position>
<foo2>
</foo2>
</position>
</values>
</second>
</types>
</element>
</list>
До сих пор у меня есть следующий XLST, который копирует преобразование сверху:
<xsl:key name="types" match="type" use="."/>
<xsl:template match="/list">
<root>
<xsl:apply-templates select="element/values/position/type[generate-id() = generate-id(key('types', .)[1])]"/>
<xsl:apply-templates select="*|@*|comment()|text()"/>
</root>
</xsl:template>
<xsl:template match="type">
<xsl:variable name="currentType" select="."/>
<xsl:element name="{$currentType}">
<xsl:apply-templates select="*|@*|comment()|text()"/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name(.)}">
<xsl:apply-templates select="*|@*|comment()|text()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Как только я добавлю шаблоны примененияна родительских узлах (в шаблоне, который соответствует типу) он больше ничего не возвращает:
<xsl:template match="type">
<xsl:variable name="currentType" select="."/>
<xsl:element name="{$currentType}">
<xsl:apply-templates select="../../*|@*|comment()|text()"/>
</xsl:element>