Нужно закрыть узел только при определенном условии - PullRequest
0 голосов
/ 21 июля 2010

Пожалуйста, найдите 2 XML

Входной XML-

<feed xmlns:es="http://ucmservice">
 <element>
<es:RepositoryDetails>
    <es:Repository Type="DatabaseRepository" />
        <es:ConnetionDetails>
        <es:Param MigrationSetId="439" />
    </es:ConnetionDetails>
</es:RepositoryDetails>
<es:DocProperties>
    <es:UniqueDocId Value="_1_15">
            <es:DocProperty propertyName="EmployeeName">
                <es:PropValues>
                  <es:PropValue>Index</es:PropValue>
                </es:PropValues>
            </es:DocProperty>
            <es:DocProperty propertyName="EmployeeAddress">" +
                      <es:PropValues>
                        <es:PropValue>Gurgaon</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
                <es:DocProperty propertyName="Salary">
                      <es:PropValues>
                        <es:PropValue>15000</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
        </es:UniqueDocId>
    </es:DocProperties>
</element>

<element>
<es:RepositoryDetails>
    <es:Repository Type="DatabaseRepository" />
        <es:ConnetionDetails>
        <es:Param MigrationSetId="439" />
    </es:ConnetionDetails>
</es:RepositoryDetails>
<es:DocProperties>
    <es:UniqueDocId Value="_1_15">
            <es:DocProperty propertyName="EmployeeName">
                <es:PropValues>
                  <es:PropValue>Index1</es:PropValue>
                </es:PropValues>
            </es:DocProperty>
            <es:DocProperty propertyName="EmployeeAddress">" +
                      <es:PropValues>
                        <es:PropValue>Delhi</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
                <es:DocProperty propertyName="Salary">
                      <es:PropValues>
                        <es:PropValue>25000</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
        </es:UniqueDocId>
    </es:DocProperties>
</element>

<element>
<es:RepositoryDetails>
    <es:Repository Type="Trim" />
        <es:ConnetionDetails>
        <es:Param MigrationSetId="439" />
    </es:ConnetionDetails>
</es:RepositoryDetails>
<es:DocProperties>
    <es:UniqueDocId Value="_1_15">
            <es:DocProperty propertyName="EmployeeName">
                <es:PropValues>
                  <es:PropValue>Quality</es:PropValue>
                </es:PropValues>
            </es:DocProperty>
            <es:DocProperty propertyName="EmployeeAddress">" +
                      <es:PropValues>
                        <es:PropValue>Mumbai</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
                <es:DocProperty propertyName="Salary">
                      <es:PropValues>
                        <es:PropValue>20000</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
        </es:UniqueDocId>
    </es:DocProperties>
</element>

<element>
<es:RepositoryDetails>
    <es:Repository Type="DatabaseRepository" />
        <es:ConnetionDetails>
        <es:Param MigrationSetId="439" />
    </es:ConnetionDetails>
</es:RepositoryDetails>
<es:DocProperties>
    <es:UniqueDocId Value="_1_15">
            <es:DocProperty propertyName="EmployeeName">
                <es:PropValues>
                  <es:PropValue>Index</es:PropValue>
                </es:PropValues>
            </es:DocProperty>
            <es:DocProperty propertyName="EmployeeAddress">" +
                      <es:PropValues>
                        <es:PropValue>Gurgaon</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
                <es:DocProperty propertyName="Salary">
                      <es:PropValues>
                        <es:PropValue>21000</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
        </es:UniqueDocId>
    </es:DocProperties>
</element>


<element>
<es:RepositoryDetails>
    <es:Repository Type="Trim" />
        <es:ConnetionDetails>
        <es:Param MigrationSetId="439" />
    </es:ConnetionDetails>
</es:RepositoryDetails>
<es:DocProperties>
    <es:UniqueDocId Value="_1_15">
            <es:DocProperty propertyName="EmployeeName">
                <es:PropValues>
                  <es:PropValue>Index1</es:PropValue>
                </es:PropValues>
            </es:DocProperty>
            <es:DocProperty propertyName="EmployeeAddress">" +
                      <es:PropValues>
                        <es:PropValue>Gurgaon</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
                <es:DocProperty propertyName="Salary">
                      <es:PropValues>
                        <es:PropValue>15000</es:PropValue>
                      </es:PropValues>
                </es:DocProperty>
        </es:UniqueDocId>
    </es:DocProperties>
</element></feed>

Требуемый Выходной XML-

<tree>
<item level="0" name="DatabaseRepository">
    <item level="1" name="Index">
        <item level="2" name="Gurgaon"/>
        <item level="2" name="Mumbai"/>
    </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="0" name="Mumbai"/>
    <item level="1" name="Index1">
        <item level="0" name="Gurgaon"/>
    </item>
</item>
</tree>

Я не знаю, как это реализовать.Я пробовал несколько вещей в XSL и Javascript, но их недостаточно.

1 Ответ

2 голосов
/ 21 июля 2010

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, как было написано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...