XSLT:根据子节点的属性排序 [英] XSLT: Sort based on child node's attribute

查看:34
本文介绍了XSLT:根据子节点的属性排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想根据子节点的名称属性对父节点进行排序.

I want to sort parent node, based on child's name attribute.

未排序的 XML:

<grand-parent>
  <parent>
    <child name="c"/>
    <child_next name="a"/>
  </parent>
  <parent>
    <child name="a"/>
    <child_next name="a"/>
  </parent>
  <parent>
    <child name="b"/>
    <child_next name="a"/>
  </parent>
</grand-parent>

预期输出:

<grand-parent>
  <parent>
    <child name="a"/>
    <child_next name="a"/>
  </parent>
  <parent>
    <child name="b"/>
    <child_next name="a"/>
  </parent>
  <parent>
    <child name="c"/>
    <child_next name="a"/>
  </parent>
</grand-parent>

正在使用的 XSLT(不起作用 - 返回与输入相同的 XML):

XSLT In Use (not working - returns the same XML that is input):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes" method="xml" encoding="UTF-8"/>
  <xsl:strip-space  elements="*"/>
  <xsl:template match="node()|@*" name="identity">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*">
        <xsl:sort select="/grand-parent/parent/child/@name" order="descending" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>  
</xsl:stylesheet>

推荐答案

我会排除身份转换:

XSLT 1.0

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

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

    <xsl:template match="grand-parent">
        <xsl:copy>
            <xsl:apply-templates select="parent|@*">
                <xsl:sort select="child/@name" data-type="text"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

输出

<grand-parent>
   <parent>
      <child name="a"/>
      <child_next name="a"/>
   </parent>
   <parent>
      <child name="b"/>
      <child_next name="a"/>
   </parent>
   <parent>
      <child name="c"/>
      <child_next name="a"/>
   </parent>
</grand-parent>

这篇关于XSLT:根据子节点的属性排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆