我尝试按属性值对xml节点进行排序,但是虽然我正确地对它们进行了排序,但我无法将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>
答案 0 :(得分: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循环中按属性值排序。此外,您应该避免使用for-each循环并使用模板。
答案 1 :(得分: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="Á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>
答案 2 :(得分: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>