2016-03-04 12 views
-1

Я попытался отсортировать узлы XML по значению атрибута, но хотя я их правильно отсортировал, я не могу получить тот же xml, который был изменен как вывод.XLS сортировать узлы xml по атрибуту

Источник:

<?xml version="1.0" encoding="UTF-8"?> 
<enumeration attributeTypeId="com.ibm.team.workitem.enumeration.area" name="Área"> 
    <literal externalValue="Enol" id="com.ibm.team.workitem.enumeration.area.literal.l3" name="Enol"/> 
    <literal externalValue="Pasivo" id="com.ibm.team.workitem.enumeration.area.literal.l8" name="Pasivo"/> 
    <literal externalValue="Proyectos" id="com.ibm.team.workitem.enumeration.area.literal.l5" name="Proyectos"/> 
    <literal externalValue="Servicios" id="com.ibm.team.workitem.enumeration.area.literal.l10" name="Servicios"/> 
    <literal default="true" externalValue="---" id="---" name="---" null="true" /> 
    <literal externalValue="Activo" id="com.ibm.team.workitem.enumeration.area.literal.l7" name="Activo"/> 
    <literal externalValue="Canales y MMP" id="com.ibm.team.workitem.enumeration.area.literal.l9" name="Canales y MMP"/> 
    <literal externalValue="Arquitectura" id="com.ibm.team.workitem.enumeration.area.literal.l4" name="Arquitectura"/> 
    <literal externalValue="Centro Información" id="com.ibm.team.workitem.enumeration.area.literal.l6" name="Centro Información"/> 
    <literal externalValue="Desarrollo Corporativo" id="com.ibm.team.workitem.enumeration.area.literal.l2" name="Desarrollo Corporativo"/> 
    <literal externalValue="Producción y Sistemas" id="com.ibm.team.workitem.enumeration.area.literal.l1" name="Producción y Sistemas"/> 
</enumeration> 

XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
     <xsl:for-each select="enumeration/literal"> 
     <xsl:sort select="@name"/> 
     <xsl:value-of select="@name"/> 
     <!-- this should be different, I tried with select="current()" too --> 
     </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Ожидаемый результат:

<?xml version="1.0" encoding="UTF-8"?> 
<enumeration attributeTypeId="com.ibm.team.workitem.enumeration.area" name="Área"> 
    <literal default="true" externalValue="---" id="---" name="---" null="true" /> 
    <literal externalValue="Activo" id="com.ibm.team.workitem.enumeration.area.literal.l7" name="Activo"/> 
    <literal externalValue="Arquitectura" id="com.ibm.team.workitem.enumeration.area.literal.l4" name="Arquitectura"/> 
    <literal externalValue="Canales y MMP" id="com.ibm.team.workitem.enumeration.area.literal.l9" name="Canales y MMP"/> 
    <literal externalValue="Centro Información" id="com.ibm.team.workitem.enumeration.area.literal.l6" name="Centro Información"/> 
    <literal externalValue="Desarrollo Corporativo" id="com.ibm.team.workitem.enumeration.area.literal.l2" name="Desarrollo Corporativo"/> 
    <literal externalValue="Enol" id="com.ibm.team.workitem.enumeration.area.literal.l3" name="Enol"/> 
    <literal externalValue="Pasivo" id="com.ibm.team.workitem.enumeration.area.literal.l8" name="Pasivo"/> 
    <literal externalValue="Producción y Sistemas" id="com.ibm.team.workitem.enumeration.area.literal.l1" name="Producción y Sistemas"/> 
    <literal externalValue="Proyectos" id="com.ibm.team.workitem.enumeration.area.literal.l5" name="Proyectos"/> 
    <literal externalValue="Servicios" id="com.ibm.team.workitem.enumeration.area.literal.l10" name="Servicios"/> 
</enumeration> 

ответ

1

Учитывая ввод XML:

<?xml version="1.0" encoding="UTF-8"?> 
<enumeration attributeTypeId="com.ibm.team.workitem.enumeration.area" name="Área"> 
    <literal externalValue="Enol" id="com.ibm.team.workitem.enumeration.area.literal.l3" name="Enol"/> 
    <literal externalValue="Pasivo" id="com.ibm.team.workitem.enumeration.area.literal.l8" name="Pasivo"/> 
    <literal externalValue="Proyectos" id="com.ibm.team.workitem.enumeration.area.literal.l5" name="Proyectos"/> 
    <literal externalValue="Servicios" id="com.ibm.team.workitem.enumeration.area.literal.l10" name="Servicios"/> 
    <literal default="true" externalValue="---" id="---" name="---" null="true" /> 
    <literal externalValue="Activo" id="com.ibm.team.workitem.enumeration.area.literal.l7" name="Activo"/> 
    <literal externalValue="Canales y MMP" id="com.ibm.team.workitem.enumeration.area.literal.l9" name="Canales y MMP"/> 
    <literal externalValue="Arquitectura" id="com.ibm.team.workitem.enumeration.area.literal.l4" name="Arquitectura"/> 
    <literal externalValue="Centro Información" id="com.ibm.team.workitem.enumeration.area.literal.l6" name="Centro Información"/> 
    <literal externalValue="Desarrollo Corporativo" id="com.ibm.team.workitem.enumeration.area.literal.l2" name="Desarrollo Corporativo"/> 
    <literal externalValue="Producción y Sistemas" id="com.ibm.team.workitem.enumeration.area.literal.l1" name="Producción y Sistemas"/> 
</enumeration> 

И дал XSLT sytlesheet:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="enumeration"> 
    <xsl:copy> 
    <xsl:apply-templates select="literal"> 
     <xsl:sort select="@name"/> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Урожайность выход:

<?xml version="1.0" encoding="UTF-8"?> 
<enumeration> 
    <literal default="true" externalValue="---" id="---" name="---" null="true"/> 
    <literal externalValue="Activo" id="com.ibm.team.workitem.enumeration.area.literal.l7" name="Activo"/> 
    <literal externalValue="Arquitectura" id="com.ibm.team.workitem.enumeration.area.literal.l4" name="Arquitectura"/> 
    <literal externalValue="Canales y MMP" id="com.ibm.team.workitem.enumeration.area.literal.l9" name="Canales y MMP"/> 
    <literal externalValue="Centro Información" id="com.ibm.team.workitem.enumeration.area.literal.l6" name="Centro Información"/> 
    <literal externalValue="Desarrollo Corporativo" id="com.ibm.team.workitem.enumeration.area.literal.l2" name="Desarrollo Corporativo"/> 
    <literal externalValue="Enol" id="com.ibm.team.workitem.enumeration.area.literal.l3" name="Enol"/> 
    <literal externalValue="Pasivo" id="com.ibm.team.workitem.enumeration.area.literal.l8" name="Pasivo"/> 
    <literal externalValue="Producción y Sistemas" id="com.ibm.team.workitem.enumeration.area.literal.l1" name="Producción y Sistemas"/> 
    <literal externalValue="Proyectos" id="com.ibm.team.workitem.enumeration.area.literal.l5" name="Proyectos"/> 
    <literal externalValue="Servicios" id="com.ibm.team.workitem.enumeration.area.literal.l10" name="Servicios"/> 
</enumeration> 

Я не совсем уверен, что если вы можете отсортировать по значению атрибута в наличии для каждого цикла. Также вам следует избегать использования for-each циклов и использовать шаблоны.

+0

Ваш первый шаблон является излишним. –

+0

@ michael.hor257k вы правы, но я всегда оставляю это как силу привычки. – Neijwiert

0

Одной из возможностей для достижения этой цели является следующая таблица стилей. Отрегулируйте шаблон match= в соответствии с вашими потребностями.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" method="xml" /> 
    <xsl:template match="/enumeration[@attributeTypeId='com.ibm.team.workitem.enumeration.area' and @name='Área']"> 
    <enumeration attributeTypeId="{@attributeTypeId}" name="{@name}"> 
     <xsl:for-each select="literal"> 
     <xsl:sort select="@name"/> 
     <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </enumeration> 
    </xsl:template> 
</xsl:stylesheet> 

Это приводит к

<?xml version="1.0"?> 
<enumeration attributeTypeId="com.ibm.team.workitem.enumeration.area" name="&#xC1;rea"> 
    <literal default="true" externalValue="---" id="---" name="---" null="true"/> 
    <literal externalValue="Activo" id="com.ibm.team.workitem.enumeration.area.literal.l7" name="Activo"/> 
    <literal externalValue="Arquitectura" id="com.ibm.team.workitem.enumeration.area.literal.l4" name="Arquitectura"/> 
    <literal externalValue="Canales y MMP" id="com.ibm.team.workitem.enumeration.area.literal.l9" name="Canales y MMP"/> 
    <literal externalValue="Centro Informaci&#xF3;n" id="com.ibm.team.workitem.enumeration.area.literal.l6" name="Centro Informaci&#xF3;n"/> 
    <literal externalValue="Desarrollo Corporativo" id="com.ibm.team.workitem.enumeration.area.literal.l2" name="Desarrollo Corporativo"/> 
    <literal externalValue="Enol" id="com.ibm.team.workitem.enumeration.area.literal.l3" name="Enol"/> 
    <literal externalValue="Pasivo" id="com.ibm.team.workitem.enumeration.area.literal.l8" name="Pasivo"/> 
    <literal externalValue="Producci&#xF3;n y Sistemas" id="com.ibm.team.workitem.enumeration.area.literal.l1" name="Producci&#xF3;n y Sistemas"/> 
    <literal externalValue="Proyectos" id="com.ibm.team.workitem.enumeration.area.literal.l5" name="Proyectos"/> 
    <literal externalValue="Servicios" id="com.ibm.team.workitem.enumeration.area.literal.l10" name="Servicios"/> 
</enumeration> 
0

Вместо:

<xsl:template match="/"> 
     <xsl:for-each select="enumeration/literal"> 
     <xsl:sort select="@name"/> 
     <xsl:value-of select="@name"/> 
     <!-- this should be different, I tried with select="current()" too --> 
     </xsl:for-each> 
</xsl:template> 

попробовать:

<xsl:template match="/enumeration"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:for-each select="literal"> 
      <xsl:sort select="@name"/> 
      <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
Смежные вопросы