XSL对来自多个节点

时间:2016-06-28 14:29:22

标签: xml sorting xslt

我有这个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>

1 个答案:

答案 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']"/>