xsl无法对添加的节点进行排序

时间:2016-03-11 20:02:54

标签: xml sorting xpath xslt-1.0

在xsl中添加了一些节点后,我需要使用xml文档节点对它们进行排序,以正确格式化文本输出。 请注意,输出可以按照不同的方式排序,具体取决于阅读文本文档首选项目顺序的应用程序。

这是XML:

$(document).ready(function(){

    var my_param = getUrlParameter('key');
    if(my_param == "value"){
//do your stuff here
}

});


var getUrlParameter = function getUrlParameter(sParam) {
    var sPageURL = decodeURIComponent(window.location.search.substring(1)),
        sURLVariables = sPageURL.split('&'),
        sParameterName,
        i;

    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : sParameterName[1];
        }
    }
};

这是XSL:

<?xml version="1.0" encoding="UTF-8"?>
<Main>
    <GroupA>
        <a>A</a>
        <b>B</b>
        <Sub type="Z">
            <bb name="100" dev="1" c="C"><P>N100</P></bb>
            <bb name="50" dev="1" c="C"><P>N50</P></bb>
            <bb name="20" dev="1" c="C"><P>N20</P></bb>
            <bb name="10" dev="1" c="C"><P>N10</P></bb>
            <bb name="5" dev="1" c="C"><P>N5</P></bb>
            <bb name="200" dev="2" c="C"><P>C200</P></bb>
            <bb name="100" dev="2" c="C"><P>C100</P></bb>
            <bb name="50" dev="2" c="C"><P>C50</P></bb>
            <bb name="25" dev="2" c="C"><P>C25</P></bb>
            <bb name="10" dev="2" c="C"><P>C10</P></bb>
            <bb name="5" dev="2" c="C"><P>C5</P></bb>
            <bb name="1" dev="2" c="C"><P>C1</P></bb>
            <bb name="100" dev="1" c="U"><P>N100</P></bb>
            <bb name="50" dev="1" c="U"><P>N50</P></bb>
            <bb name="20" dev="1" c="U"><P>N20</P></bb>
            <bb name="10" dev="1" c="U"><P>N10</P></bb>
            <bb name="5" dev="1" c="U"><P>N5</P></bb>           
            <bb name="2" dev="1" c="U"><P>N2</P></bb>           
            <bb name="1" dev="1" c="U"><P>N1</P></bb>           
        </Sub>
        <Sub type="B">
            <bb name="111" dev="1" c="C"><P>N100</P></bb>
            <bb name="55" dev="1" c="C"><P>N50</P></bb>
            <bb name="22" dev="1" c="C"><P>N20</P></bb>
            <bb name="11" dev="1" c="C"><P>N10</P></bb>
            <bb name="5" dev="1" c="C"><P>N5</P></bb>
            <bb name="222" dev="2" c="C"><P>C200</P></bb>
            <bb name="111" dev="2" c="C"><P>C100</P></bb>
            <bb name="55" dev="2" c="C"><P>C50</P></bb>
            <bb name="25" dev="2" c="C"><P>C25</P></bb>
            <bb name="11" dev="2" c="C"><P>C10</P></bb>
            <bb name="5" dev="2" c="C"><P>C5</P></bb>
            <bb name="1" dev="2" c="C"><P>C1</P></bb>
        </Sub>
    </GroupA>
</Main>

这是当前的输出: A,B,N1000XN2XN1XN100,N50,N20,N10,N5,C200,C100,C50,C25,C10,C5,C1

这是我想要的输出: A,B,N1000X,N100,N50,N20,N10,N5,N2X,和N1x,C200,C100,C50,C25,C10,C5,C1

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果(!)我理解正确,你想做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="add">
    <bb c="C" name="1000" dev="1"><P>N1000X</P></bb>
    <bb c="C" name="2" dev="1"><P>N2X</P></bb>
    <bb c="C" name="1" dev="1"><P>N1X</P></bb>
</xsl:variable>

<xsl:template match="GroupA">
        <xsl:value-of select="a" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="b" />
        <xsl:text>,</xsl:text>
        <xsl:for-each select="Sub[@type='Z']/bb[@c='C'] | exsl:node-set($add)/bb">
            <xsl:sort select="@dev" data-type="number" order="ascending"/>
            <xsl:sort select="@name" data-type="number" order="descending"/>
            <xsl:value-of select="P"/>
            <xsl:if test="position()!=last()">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:for-each>             
</xsl:template> 

</xsl:stylesheet>