使用多个字段进行XSL排序

时间:2018-01-03 19:26:41

标签: xml xslt

由于可能很简单但逃避我的原因,我无法在复制时将以下参考书目排序。

这是XML的一个示例:

<listBibl>
  <biblStruct type="book">
    <monogr>
        <title level="book-title">Magic in the Middle Ages</title>
        <author>
            <forename>Richard</forename><surname>Kieckhefer</surname>
        </author>
        <imprint>
            <pubPlace>Toronto</pubPlace>
            <publisher>Cambridge University Press</publisher>
            <date>2000</date>
        </imprint>
    </monogr>
  </biblStruct>
  <biblStruct type="journal-article">
    <analytic>
        <title level="article-title">Social Mentalities and the Cases of Medieval Scepticism</title>
        <author>
            <forename>Susan</forename><surname>Reynolds</surname>
        </author>
    </analytic>
    <monogr>
        <title level="journal-name">Transactions of the Royal Historical Society</title>
        <imprint>
            <biblScope unit="volume">1</biblScope>
            <biblScope unit="page">21-41</biblScope>
            <date>1991</date>
        </imprint>
    </monogr>
  </biblStruct>
  <biblStruct type="book">
    <monogr>
        <title level="book-title">Pathways to Medieval Peasants</title>
        <editor>
            <forename>James Ambrose</forename>
            <surname>Raftis</surname>
        </editor>
        <imprint>
            <pubPlace>Toronto</pubPlace>
            <publisher>Pontifical Institute of Mediaeval Studies</publisher>
            <date>1981</date>
        </imprint>
    </monogr>
  </biblStruct>
  <biblStruct type="book">
    <monogr>
        <title level="book-title">Kingdoms and Communities in Western Europe, 900-1300</title>
        <author>
            <forename>Susan</forename><surname>Reynolds</surname>
        </author>
        <imprint>
            <pubPlace>Oxford</pubPlace>
            <publisher>Oxford University Press</publisher>
            <date>1997</date>
        </imprint>
    </monogr>
  </biblStruct>
<listBibl>

每个biblStruct代表一个具有作者或编辑的作品,它是我的排序基础。

所需的排序逻辑是:

首先排序1:根据biblStruct @type找到书籍或文章的第一作者并对其进行排序

biblStruct[@type='book']/monogr/author[1]/surname | 
biblStruct[@type='journal-article']/analytic/author[1]/surname 

然后排序2:获取title @level并对其进行排序

title[@level='book-title'] | title[@level='article-title']

我现在使用简单的xsl:copy,即使只是基本的排序也行不通。它只是复制原件。 XSL:

<xsl:template match="listBibl">
    <xsl:copy>
        <xsl:apply-templates>
            <xsl:sort select="biblStruct[@type='book']/monogr/author[1]/surname | biblStruct[@type='journal-article']/analytic/author[1]/surname "/>
            <xsl:sort select="title[@level='book-title'] | title[@level='article-title'] "/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

这应该复制原件,但按作者姓氏排序,然后按每位作者的标题排序。

提前致谢。

1 个答案:

答案 0 :(得分:2)

如果你对apply-templates的孩子listBibl,那么排序需要相对于那个,所以如果biblStruct是其中一个孩子,则以biblStruct开头的路径没有意义,除非你有相互嵌套的元素。并且title元素是进一步下降的后代,因此以title开头的路径似乎也错过了目标。

如果您将路径更改为例如

      <xsl:apply-templates>
          <xsl:sort select=".[@type='book']/monogr/author[1]/surname | .[@type='journal-article']/analytic/author[1]/surname"/>
          <xsl:sort select=".//title[@level='book-title'] | .//title[@level='article-title']"/>
      </xsl:apply-templates>

我希望你能得到更好的结果。

http://xsltfiddle.liberty-development.net/jyyiVhh/1