ребята, рекурсия с группировкой не работает. Я использую XSLT 1.0.
Мне нужна помощь, чтобы понять это. Заранее спасибо.
Справочная информация:
У меня есть 3 различных типа (общие, категории и сложные) в XML. Моя цель -
1 - Группировка узлов XML на основе типов.
2 - Создайте подгруппу для комплекса под Type = Common.
3 - Для Type = complex создайте количество коллекций в зависимости от исходного XML. В каждой коллекции должно быть только 4 элемента, где Name = 'A' или 'B' или 'C' или 'D'.
Вот где у меня проблема. Группировка и подгруппа работает нормально. Однако, когда я пытаюсь создать коллекцию, используя рекурсию, она не дает мне ожидаемый результат. Для справки см. Ожидаемый пример xml.
Исходный XML:
<?xml version="1.0" encoding="Windows-1252"?>
<XML>
<Attributes>
<Attribute>
<Name>Buyer ID</Name>
<Type>common</Type>
<Value>Lee</Value>
</Attribute>
<Attribute>
<Name>Enviornment</Name>
<Type>common</Type>
<Value>Dev</Value>
</Attribute>
<Attribute>
<Name>Retail</Name>
<Type>common</Type>
<Value></Value>
</Attribute>
<Attribute>
<Name>Gender</Name>
<Type>category</Type>
<Value>M</Value>
</Attribute>
<Attribute>
<Name>Collection</Name>
<Type>Complex</Type>
<Value>ing</Value>
<Path />
</Attribute>
<Attribute>
<Name>A</Name>
<Type>Complex</Type>
<Value>Testing</Value>
<Path />
</Attribute>
<Attribute>
<Name>B</Name>
<Type>Complex</Type>
<Value>Yellow</Value>
<Path />
</Attribute>
<Attribute>
<Name>C</Name>
<Type>Complex</Type>
<Value>10</Value>
<Path />
</Attribute>
<Attribute>
<Name>D</Name>
<Type>Complex</Type>
<Value>MA</Value>
<Path />
</Attribute>
<Attribute>
<Name>A</Name>
<Type>Complex</Type>
<Value>24a</Value>
<Path />
</Attribute>
<Attribute>
<Name>B</Name>
<Type>Complex</Type>
<Value>Green</Value>
<Path />
</Attribute>
<Attribute>
<Name>C</Name>
<Type>Complex</Type>
<Value>22</Value>
<Path />
</Attribute>
<Attribute>
<Name>D</Name>
<Type>Complex</Type>
<Value>AM</Value>
<Path />
</Attribute>
</Attributes>
</XML>
Ожидаемый результат:
<?xml version="1.0" encoding="utf-8"?>
<Data Schema="XML A">
<Items>
<Item>
<Attributes type="common">
<Attr name="Buyer ID" value="Lee" />
<Attr name="Enviornment" value="Dev" />
<Attr name="Retail" value="" />
<Collection name="Collection" >
<Complex>
<Attr name="A" value="Testing" />
<Attr name="B" value="Yellow" />
<Attr name="C" value="10" />
<Attr name="D" value="MA" />
</Complex>
<Complex>
<Attr name="A" value="24a" />
<Attr name="B" value="Green" />
<Attr name="C" value="22" />
<Attr name="D" value="AM" />
</Complex>
</Collection>
</Attributes>
<Attributes type="category">
<Attr name="Gender" value="M" />
</Attributes>
<errorCodes>
<errorCode>value for Retail is missing.</errorCode>
</errorCodes>
</Item>
</Items>
</Data>
Вот XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="type" match="Attribute" use="Type"/>
<xsl:variable name="group" select="4"/>
<xsl:template match="/">
<Data Schema="XML A">
<Items>
<Item>
<xsl:apply-templates select="XML/Attributes/Attribute[generate-id() = generate-id(key('type', Type)[1])]">
<xsl:sort select="Type" order="descending"/>
</xsl:apply-templates>
<errorCodes>
<xsl:apply-templates select="XML/Attributes/Attribute" mode="errors"/>
</errorCodes>
</Item>
</Items>
</Data>
</xsl:template>
<xsl:template match="Attribute">
<xsl:variable name="compType" select="count(/XML/Attributes/Attribute[Type='Complex' and Name!='Collection'])"/>
<xsl:if test="Type!='Complex'">
<Attributes type="{Type}">
<xsl:apply-templates select="key('type',Type)" mode="out"/>
<xsl:if test="Type='common'">
<Collection>
<xsl:for-each select="/XML/Attributes/Attribute[Type='Complex']">
<xsl:choose>
<xsl:when test="(Name='A' or Name='B' or Name='C' or Name='D')">
<xsl:if test="(($compType > 0) and (Name!='Collection'))">
<xsl:apply-templates select="key('type','Complex')" mode="out"/>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<Complex>
<Attr id="" name="A" value="Default" />
<Attr id="" name="B" value="Default" />
<Attr id="" name="C" value="Default" />
<Attr id="" name="D" value="" />
</Complex>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</Collection>
</xsl:if>
</Attributes>
</xsl:if>
</xsl:template>
<xsl:template match="Attribute" mode="out">
<Collection>
<Attr name="{Name}" value="{Value}"/>
</Collection>
</xsl:template>
<xsl:template match="Attribute[Type='Complex']" mode="out">
<xsl:apply-templates select="XML/Attributes/Attribute[not(Name='Collection')]
[position() mod $group = 1]" mode="group"/>
</xsl:template>
<xsl:template match="Name" mode="group">
<xsl:if test="Name!='Collection'">
<Attr name="{Name}" value="{Value}"/>
</xsl:if>
</xsl:template>
<xsl:template match="Attribute">
<Complex>
<xsl:apply-templates
select=".|following-sibling::Attribute[position() < $group]" mode="inner" />
</Complex>
</xsl:template>
<xsl:template match="Attribute" mode="errors">
<xsl:if test="(Name='Retail' or Name='Product Description') and Value=''">
<errorCode>value for <xsl:value-of select="Name"/> is missing.</errorCode>
</xsl:if>
</xsl:template>
</xsl:stylesheet>