【问题标题】:XSLT - Sort xml parent segments based on child tagXSLT - 根据子标签对 xml 父段进行排序
【发布时间】:2019-01-22 08:22:18
【问题描述】:

我需要根据子标签值对 xml 段进行排序,即使父标签可以有不同的名称。

我的输入xml是这样的

<root>
  <A>
    <id>1000</id>
  </A>
  <A>
     <id>1001</id>
  </A>
  <A>
    <id>1002</id>
  </A>

  <B>
    <id>1000</id>
  </B>
  <B>
    <id>1001</id>
  </B>
  <B>
    <id>1002</id>
  </B>
</root> 

无论父标签是什么,我都希望对标签“id”进行排序。所以结果应该是这样的:

 <root>
    <A>
       <id>1000</id>
    </A>
    <B>
       <id>1000</id>
    </B>

    <A>
       <id>1001</id>
    </A>
    <B>
       <id>1001</id>
    </B>

    <A>
       <id>1002</id>
    </A>
    <B>
       <id>1002</id>
    </B>
  </root>

如何在 xslt 中实现这一点?

谢谢! 汤姆

【问题讨论】:

  • 您好,欢迎来到 Stackoverflow,这不是编码服务,暴露的问题必须与您编写的代码一起解决问题,请阅读How to Ask 以更好地了解如何询问正确的问题

标签: sorting xslt


【解决方案1】:

匹配root的模板应该包含apply-templates 使用select="*"(适用于所有子节点)和&lt;xsl:sort select="id"/&gt; 里面。

所以整个 XSLT 脚本如下所示:

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

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="*">
        <xsl:sort select="id"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

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

注意我用&lt;xsl:strip-space elements="*"/&gt;来实现 “更好”的输出格式。试试没有它的转换看看 区别。

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多