XSLT 用于根据元素的属性对特定 XML 标记的元素进行排序

Posted

技术标签:

【中文标题】XSLT 用于根据元素的属性对特定 XML 标记的元素进行排序【英文标题】:XSLT for sorting elements of particular XML tags based on elements' attribute 【发布时间】:2019-06-10 03:03:41 【问题描述】:

想要转换(排序)“特定标签的元素”

我是 XSLT 的新手。因此需要了解 XSLT 如何处理特定标记。

当前 XML

<root>
    <tag>bla bla bla</tag>
    <tag>foo foo foo</tag>
    <tag>
         <particular-tag>
               <element attrib="2"/>
               <element attrib="3"/>
               <element attrib="4"/>
               <element attrib="1"/>
         </particular-tag>
         <particular-tag>
               <element attrib="5"/>
               <element attrib="3"/>
               <element attrib="4"/>
         </particular-tag>
    </tag>
</root>

所需的 XML

<root>
    <tag>bla bla bla</tag>
    <tag>foo foo foo</tag>
    <tag>
         <particular-tag>
               <element attrib="1"/>
               <element attrib="2"/>
               <element attrib="3"/>
               <element attrib="4"/>
         </particular-tag>
         <particular-tag>
               <element attrib="3"/>
               <element attrib="4"/>
               <element attrib="5"/>
         </particular-tag>
    </tag>
</root>

提前致谢。您可以向我推荐在线学习资源,我可以在其中使用 XML-XLST。

【问题讨论】:

【参考方案1】:

这应该会产生您正在寻找的结果。 希望对您有所帮助。

<?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" encoding="utf-8"/>

  <xsl:template match="particular-tag">
    <particular-tag>
      <xsl:apply-templates select="element">
        <xsl:sort select="@attrib"/>
      </xsl:apply-templates>
    </particular-tag>
  </xsl:template>

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

</xsl:stylesheet>

【讨论】:

感谢您的解决方案,我将 &lt;particular-tag&gt; 替换为 &lt;xsl:copy&gt;【参考方案2】:

此 XSLT 将产生所需的结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="particular-tag">
    <xsl:copy>
      <xsl:apply-templates select="*">
        <xsl:sort select="@attrib"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

根据这个问题请求解决方案Sorting cells as per ss:Index

以上是关于XSLT 用于根据元素的属性对特定 XML 标记的元素进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 从 XML 中删除元素标记

如何在特定节点的 XSLT 中显示属性?

Ruby XML, XSLT 和 XPath 教程

xslt - 根据父亲属性修改文本子项

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序

Ruby XML, XSLT 和 XPath 教程