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

时间:2019-01-16 03:38:42

标签: xml sorting xslt xpath

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

我是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。

2 个答案:

答案 0 :(得分:-1)

此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>

答案 1 :(得分:-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>