我怎样才能只对某个元素的某些子元素进行排序?

时间:2014-03-28 21:59:24

标签: xml xslt

我有一个场景,我只想对元素的一些子元素进行排序。也就是说,我想根据Sorted="1"属性对具有field属性的子项进行排序,而不是对具有Sorted="0"的子项进行排序。

输入

<?xml version="1.0" encoding="utf-8"?>
<root>
  <Row field="G" Sorted="1" />
  <Row field="A" Sorted="1" />
  <Row field="B" Sorted="0" />
  <Row field="H" Sorted="1" />
  <Row field="D" Sorted="1" />
  <Row field="M" Sorted="0" />
  <Row field="U" Sorted="1" />
  <Row field="W" Sorted="1" />
  <Row field="Z" Sorted="0" />
  <Row field="L" Sorted="1" />
  <Row field="A" Sorted="0" />
  <Row field="W" Sorted="1" />
</root>

当前XSLT

<?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" indent="yes"/>

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:for-each select="/Row[@Sorted='1']">
        <xsl:sort select="@field" order="ascending"/>
        <xsl:copy-of select="."/>
      </xsl:for-each>
    </xsl:copy>
    <xsl:copy>
      <xsl:for-each select="/Row[@Sorted='0']">
        <xsl:copy-of select="."/>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

期望输出

<?xml version="1.0" encoding="utf-8"?>
<root>
  <Row field="A" Sorted="1" />
  <Row field="D" Sorted="1" />
  <Row field="G" Sorted="1" />
  <Row field="H" Sorted="1" />
  <Row field="L" Sorted="1" />
  <Row field="U" Sorted="1" />
  <Row field="W" Sorted="1" />
  <Row field="W" Sorted="1" />
  <Row field="B" Sorted="0" />
  <Row field="M" Sorted="0" />
  <Row field="Z" Sorted="0" />
  <Row field="A" Sorted="0" />
</root> 

1 个答案:

答案 0 :(得分:1)

回复您的更新问题:

  

使用Sorted = 1对行进行排序,并将它们复制到顶部并复制其余部分   在xml未排序

的底部排序= 0的行

这可以简单地完成:

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

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

<xsl:template match="root">
    <xsl:copy>
        <xsl:apply-templates select="Row[@Sorted='1']">
            <xsl:sort select="@field" data-type="text" order="ascending"/>
        </xsl:apply-templates>
        <xsl:apply-templates select="Row[@Sorted='0']"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

或者,如果您愿意:

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

<xsl:template match="/root">
    <xsl:copy>
        <xsl:for-each select="Row[@Sorted='1']">
            <xsl:sort select="@field" data-type="text" order="ascending"/>
            <xsl:copy-of select="."/>
        </xsl:for-each>
        <xsl:for-each select="Row[@Sorted='0']">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>