【问题标题】:XSLT: attribute sortingXSLT:属性排序
【发布时间】:2011-09-24 10:38:21
【问题描述】:

我需要一个小例子的帮助,以便我更好地理解xsl:sort

我的 XML 数据如下所示:

<NewTerms>
    <newTerm ID="3">Zebra</newTerm>
    <newTerm ID="11">Horse</newTerm>
    <newTerm ID="1">Cat</newTerm>
    <newTerm ID="90">Lion</newTerm>
    <newTerm ID="62">Jaguar</newTerm>
    <newTerm ID="30">Cheetah</newTerm>
    <newTerm ID="55">Deer</newTerm>
    <newTerm ID="45">Buffalo</newTerm>
    <newTerm ID="15">Dog</newTerm>
</NewTerms ID="10">

我想根据ID 属性对它们进行排序。我拥有的 XSL 不起作用:

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

    <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>

    <xsl:template match="@*|node()[not(preceding::node()=.)]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[not(preceding::node()=.)]">
                <xsl:sort select="./@ID"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

我不知道xsl:sort 函数是如何工作的。帮助我通过这个例子更好地理解它。

【问题讨论】:

  • 很高兴看到End-Tag 中的属性:D
  • +1 个基本但有用的问题。

标签: xslt sorting attributes tags


【解决方案1】:

您的变换正确。您只需要指定 data-type 属性,默认情况下该属性是“文本”,因此不适用于数字。

有关使用xsl:sort 的更多信息,您可以查看specs 和最近类似的question

这里有几点说明:

  • 您可以省略./@ID,因为. 选择了模板中默认的上下文节点
  • 您不需要以这种方式检查前面的节点,这没有意义。

注意您只需要带有排序指令的Identity Transformation

您的最终转换将如下所示:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0">

    <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
    <xsl:strip-space elements="*"/>

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

</xsl:stylesheet>

当应用于输入时(此处稍作修改以修复您的结束标签拼写错误):

<NewTerms>   
    <newTerm ID="3">Zebra</newTerm>
    <newTerm ID="11">Horse</newTerm> 
    <newTerm ID="1">Cat</newTerm>   
    <newTerm ID="90">Lion</newTerm>   
    <newTerm ID="62">Jaguar</newTerm>   
    <newTerm ID="30">Cheetah</newTerm>   
    <newTerm ID="55">Deer</newTerm>   
    <newTerm ID="45">Buffalo</newTerm>   
    <newTerm ID="15">Dog</newTerm> 
</NewTerms>

产生:

<NewTerms>
   <newTerm ID="1">Cat</newTerm>
   <newTerm ID="3">Zebra</newTerm>
   <newTerm ID="11">Horse</newTerm>
   <newTerm ID="15">Dog</newTerm>
   <newTerm ID="30">Cheetah</newTerm>
   <newTerm ID="45">Buffalo</newTerm>
   <newTerm ID="55">Deer</newTerm>
   <newTerm ID="62">Jaguar</newTerm>
   <newTerm ID="90">Lion</newTerm>
</NewTerms>

【讨论】:

    【解决方案2】:

    NewTerms 的分类标记中的ID 属性似乎不合适。

    以下 XSL 脚本根据 ID 属性对数据进行排序:

    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output method="xml"/>
    
      <xsl:template match="@*|node()">
        <xsl:copy-of select="." />
      </xsl:template>
    
      <xsl:template match="/NewTerms">
        <xsl:copy>
          <xsl:apply-templates select="newTerm">
            <xsl:sort select="@ID" data-type="number" />
          </xsl:apply-templates>
         </xsl:copy>
      </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

    • 这些 ID 属性值看起来像数字,因此可能需要执行 '` 来按要求进行排序。默认数据类型是“文本”,例如“110”会在“12”之前结束。
    【解决方案3】:

    正如 cmets 对 @rsp 的回答所指出的,default sort data-type 是“文本”,但您想要“数字”。在进行了一次更改后,您实际上可以使用自己的第一次尝试:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    
      <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
    
      <xsl:template match="@*|node()[not(preceding::node()=.)]">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()[not(preceding::node()=.)]">
            <xsl:sort select="./@ID" data-type="number" />
          </xsl:apply-templates>
         </xsl:copy>
      </xsl:template>
    
    </xsl:stylesheet>
    

    这使您可以保留(低效的)重复检查:

    node()[not(preceding::node()=.)] 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 2018-03-06
      相关资源
      最近更新 更多