Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT-在应用模板中对动态节点进行分组_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

Xml XSLT-在应用模板中对动态节点进行分组

Xml XSLT-在应用模板中对动态节点进行分组,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有一个这样的xml <doc> <aa type="xx">aaaa</aa> <aa type="xx">bbbb</aa> <aa type="yy">ccccc</aa> <aa type="zz">dddd</aa> <aa type="yy">eeee</aa> <aa type="xx">ff

我有一个这样的xml

<doc>
    <aa type="xx">aaaa</aa>
    <aa type="xx">bbbb</aa>
    <aa type="yy">ccccc</aa>
    <aa type="zz">dddd</aa>
    <aa type="yy">eeee</aa>
    <aa type="xx">ffff</aa>
    <aa type="yy">gggg</aa>
</doc>

aaaa
bbbb
ccccc
dddd
eeee
ffff
gggg
在我的场景中,type属性是一个变量,我需要通过检查type属性将上述xml按顺序分组,type attr值应该优先显示在top中,因此输出应该是

<doc>
    <aa type="xx">aaaa</aa>
    <aa type="xx">bbbb</aa>
    <aa type="xx">ffff</aa>
    <aa type="yy">ccccc</aa>
    <aa type="yy">eeee</aa>
    <aa type="yy">gggg</aa>
    <aa type="zz">dddd</aa>       
</doc>

aaaa
bbbb
ffff
ccccc
eeee
gggg
dddd
因为type属性值是一个变量(我不知道确切的类型值),所以我编写了一个模板,如下所示:

<xsl:template match="doc">
    <doc>
        <xsl:apply-templates select="aa[@type='{@type}']"/>
    </doc>
</xsl:template>


使用
groupby
可以更容易地实现执行任务的方法,但我只能使用
apply template

来执行此操作。我知道您希望以有序的方式在所有
节点上应用模板。您可以使用for each执行此操作,这允许排序:

<xsl:template match="doc">
    <doc>
        <xsl:for-each select="aa">
            <xsl:sort select="@type"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>
    </doc>
</xsl:template>

xsl:sort
也适用于
xsl:apply模板
,因此您可以将其简化为