2016-06-28 11 views
0

私はこのXMLファイルを持っています(無関係なノードは除外されています)。私はソートする必要があります。 著者が存在する場合、ソートは作成者にする必要があります。 同じ著者がより多くの本を書いた場合、その本はタイトルでソートされるべきです。著者が不足している場合、ソートはタイトルの最初の単語にする必要があります。 希望の順序は次のとおりです:Lacey、Minna - 新しい先進的な教授法 - テクニカル・ミューゼット - Wrede、Eva:Arton kvadrat - Wrede、Eva:Femton kvadrat。複数のノードからのコンテンツのXSLソート

著者は、MarcEntryタグ100またはMarcEntryタグ110のいずれかを持つことができますが、両方を指定することはできません。著者のないレコードがあります。すべてのレコードは私のスタイルシート

<xsl:sort select="../../marc/marcEntry[@tag='100' or @tag='110']"/> 

にタイトル= 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> 

私はこれを試してみましたがありますが、それは私だけでエラーを与えただけであったであろう半の道を、それが働いていました。

どのように続行するとよいでしょうか? 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']))"/> 

を試みることができる。しかし、あなたが「ジョーンズスチーム」という本を書いた「アイバー・エバンス」と呼ばれる著者があった場合は、この問題を持っているでしょう、 「アイバー・エヴァンス・ジョーンズ」と呼ばれる「スチーム」という本を書いたもう1人の作家。

代わりに、これらの二つの表現してみてください:表現

<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']"/> 
+0

優れています - これは、5000人以上の顧客を持つ世界的企業のデリバードスタイルシートよりも優れています! –

関連する問題