我有这个XML文件(不相关的节点遗漏)我需要排序。 当有作者时,应该对作者进行排序。 如果同一作者写了更多的书,他/她的书应该按标题排序。如果作者缺席,则排序应该在标题的第一个单词上。 期望的顺序是:Lacey,Minna - 新的高级教学方法 - Tekniska museet - Wrede,Eva:Arton kvadrat - Wrede,Eva:Femton kvadrat。
作者可以使用MarcEntry标记100或MarcEntry标记110,但不能同时使用两者。有没有作者的记录。所有记录都有一个title = MarcEntry标签245。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="gallring2.xsl"?>
<report>
<catalog>
<marc>
<marcEntry tag="100" label="Personal Author" ind="1 ">Wrede, Eva</marcEntry>
<marcEntry tag="245" label="Title" ind="10">Arton kvadrat</marcEntry>
</marc>
<call>
<item>
<itemID>3058000817845</itemID>
</item>
</call>
</catalog>
<catalog>
<marc>
<marcEntry tag="100" label="Personal Author" ind="1 ">Wrede, Eva</marcEntry>
<marcEntry tag="245" label="Title" ind="10">Femton kvadrat</marcEntry>
</marc>
<call>
<item>
<itemID>30580008156593</itemID>
</item>
</call>
</catalog>
<catalog>
<marc>
<marcEntry tag="110" label="Corporate Author" ind="2 ">Tekniska museet</marcEntry>
<marcEntry tag="245" label="Title" ind="10">35 mer eller mindre märkliga föremål i Tekniska museets samlingar</marcEntry>
</marc>
<call>
<item>
<itemID>30580008290806</itemID>
</item>
</call>
</catalog>
<catalog>
<marc>
<marcEntry tag="100" label="Personal Author" ind="1 ">Lacey, Minna</marcEntry>
<marcEntry tag="245" label="Title" ind="10">365 experiment för nyfikna barn</marcEntry>
</marc>
<call>
<item>
<itemID>30580009824363</itemID>
</item>
</call>
</catalog>
<catalog>
<marc>
<marcEntry tag="245" label="Title" ind="10">New advanced teaching methods.</marcEntry>
</marc>
<call>
<item>
<itemID>30580008182334</itemID>
</item>
</call>
</catalog>
</report>
我在样式表中试过这个
<xsl:sort select="../../marc/marcEntry[@tag='100' or @tag='110']"/>
但这只是给了我错误,只会有一半,如果它有效。
有关如何继续的任何建议? XSLT 2.0和扩展不是一种选择。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<catalog>
<xsl:for-each select="report/catalog/call/item">
<xsl:sort select="../../marc/marcEntry[@tag='100']"/>
<xsl:sort select="../../marc/marcEntry[@tag='245']"/>
<itemline>
<Author><xsl:value-of select="substring(../../marc/marcEntry[@tag='100' or @tag='110'],1,30)"/></Author>
<Title><xsl:value-of select="substring(../../marc/marcEntry[@tag='245'],1,30)"/></Title>
<itemID><xsl:value-of select="itemID"/></itemID>
</itemline>
</xsl:for-each>
</catalog>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
您可以尝试此(单个)排序表达式
<xsl:sort select="normalize-space(concat(../../marc/marcEntry[@tag='100' or @tag='110'], ' ', ../../marc/marcEntry[@tag='245']))"/>
但如果你有一位名叫“Ivor Evans”的作家写了一本名为“Jones The Steam”的书,而另一位名叫“Ivor Evans Jones”的作家写了一本名为“The Steam”的书,那就会有问题。 / p>
相反,请尝试以下两个表达式:
<xsl:sort select="../../marc/marcEntry[@tag='100' or @tag='110'] | ../../marc[not(marcEntry[@tag='100' or @tag='110'])]/marcEntry[@tag='245']"/>
<xsl:sort select="../../marc/marcEntry[@tag='245']"/>