XSLT - это дерево , а не теги. Если ваш метод вывода не text
, вы не можете создать плохо сформированное дерево. И это особенность!
Я уверен, что желаемый результат может быть получен с правильным XSLT. Вам необходимо опубликовать образец ввода и желаемый результат.
РЕДАКТИРОВАТЬ : Кроме того, чтобы помочь вам, вы должны отменить это предложение:
"Я хочу закрыть узел, только если
Поэтическое состояние верно "
Для: Я хочу добавить шаблон, если выполняется определенное условие
РЕДАКТИРОВАТЬ 2 : Теперь с вводом и выводом похоже, что вы хотите сгруппировать по двум клавишам. Итак, эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:es="http://ucmservice" exclude-result-prefixes="es">
<xsl:key name="ByType" match="element" use="es:RepositoryDetails/es:Repository/@Type"/>
<xsl:key name="ByType-Name" match="es:UniqueDocId" use="concat(../../es:RepositoryDetails/es:Repository/@Type,'++',es:DocProperty[@propertyName='EmployeeName']/es:PropValues/es:PropValue)"/>
<xsl:template match="text()"/>
<xsl:template match="feed">
<tree>
<xsl:apply-templates/>
</tree>
</xsl:template>
<xsl:template match="element"/>
<xsl:template match="element[count(.|key('ByType',es:RepositoryDetails/es:Repository/@Type)[1])=1]">
<item level="0" name="{es:RepositoryDetails/es:Repository/@Type}">
<xsl:apply-templates select="key('ByType',es:RepositoryDetails/es:Repository/@Type)/*"/>
</item>
</xsl:template>
<xsl:template match="es:UniqueDocId"/>
<xsl:template match="es:UniqueDocId[count(.|key('ByType-Name',concat(../../es:RepositoryDetails/es:Repository/@Type,'++',es:DocProperty[@propertyName='EmployeeName']/es:PropValues/es:PropValue))[1])=1]">
<item level="1" name="{es:DocProperty[@propertyName='EmployeeName']/es:PropValues/es:PropValue}">
<xsl:apply-templates select="key('ByType-Name',concat(../../es:RepositoryDetails/es:Repository/@Type,'++',es:DocProperty[@propertyName='EmployeeName']/es:PropValues/es:PropValue))/*"/>
</item>
</xsl:template>
<xsl:template match="es:DocProperty[@propertyName='EmployeeAddress']/es:PropValues/es:PropValue">
<item level="2" name="{.}" />
</xsl:template>
</xsl:stylesheet>
Вывод:
<tree>
<item level="0" name="DatabaseRepository">
<item level="1" name="Index">
<item level="2" name="Gurgaon" />
<item level="2" name="Gurgaon" />
</item>
<item level="1" name="Index1">
<item level="2" name="Delhi" />
</item>
</item>
<item level="0" name="Trim">
<item level="1" name="Quality">
<item level="2" name="Mumbai" />
</item>
<item level="1" name="Index1">
<item level="2" name="Gurgaon" />
</item>
</item>
</tree>
Примечание : в вашем желаемом выводе есть некоторые ошибки (нет DatabaseRepository-Index-Mumbai), поэтому я не могу сказать, действительно ли вы хотите внуков item [@ name = 'Trim'] с @leve 2 или 0, как было написано.