我如何在XSL中排序?

时间:2016-11-15 20:06:07

标签: xml xslt

我试图改变页面上某些元素的顺序。

http://ccri.edu/laws/faculty_staff/

如果你点击了#34;完整列表"你会注意到按钮,订单是兼职教师,工作人员,教师...我试图让它显示教师,兼职教师,工作人员。

教职员工工作人员从xml表中被拉入页面,看起来像这样

    <Persons>
  <Person>
    <Name><Last>Abatiello</Last>
    <First>Steven</First></Name>
    <Role>Staff</Role>
    <Title>Assistant Coordinator</Title>
    <Department>Student Success Center</Department>
    <Campus>Liston Campus</Campus>
    <Office>2236</Office>
    <Email>smabatiello&#64;ccri.edu</Email>
    <Telephone>555-5555</Telephone>
    <Website></Website>
  </Person>
  <Person>
    <Name><Last>Abbate</Last>
    <First>Maureen</First></Name>
    <Role>Faculty</Role>
    <Title>Professor</Title>
    <Department>English</Department>
    <Campus>Liston Campus</Campus>
    <Office></Office>
    <Email>bate&#64;ccri.edu</Email>
    <Telephone>555-5555</Telephone>
    <Website></Website>
  </Person>
</persons>

与XSL配对显示

  <xsl:when test="$department-filter != ''">
  <xsl:for-each-group select="$doc/Persons/Person[lower-case(Department) = tokenize(lower-case($department-filter),',')]" group-by="Role">
    <p><span class="facultyheader"><xsl:value-of select="current-grouping-key()"/>:&nbsp;</span>
      <xsl:for-each select="current-group()">
        <xsl:choose>
          <xsl:when test="position() != last()">
            <xsl:value-of select="concat(Name/First, ' ', Name/Last)"/>,&nbsp;
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="concat(Name/First, ' ', Name/Last)"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </p>
  </xsl:for-each-group>
</xsl:when>
<xsl:otherwise>
  <xsl:for-each-group select="$doc/Persons/Person" group-by="Role">
    <p><span class="facultyheader"><xsl:value-of select="current-grouping-key()"/>:&nbsp;</span>
      <xsl:for-each select="current-group()">
        <xsl:choose>
          <xsl:when test="position() != last()">
            <xsl:value-of select="concat(Name/First, ' ', Name/Last)"/>,&nbsp;
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="concat(Name/First, ' ', Name/Last)"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </p>
  </xsl:for-each-group>
</xsl:otherwise>
</xsl:choose>

所以现在它按字母顺序排序......我知道我必须编辑XSL我只是为了确定要编辑的内容。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

处理组的顺序由xsl:for-each-group

的xsl:sort子项确定
<xsl:for-each-group select="..." group-by="Role">
  <xsl:sort select="...."/>

这就留下了使用什么类型密钥的问题。对于这种事情,最好的方法是有一个功能:

<xsl:function name="f:role-rank" as="xs:integer">
  <xsl:param name="role" as="xs:string"/>
  <xsl:sequence select="index-of(('Faculty', 'Adjunct-Faculty', 'Staff'), $role)"/>
</xsl:function>

然后

<xsl:sort select="f:role-rank(current-grouping-key())"/>

您也可以直接在xsl:sort/@select中调用index-of,但这会给出一些抽象。