2016-03-30 20 views
0

Ich arbeite mit einer ziemlich seltsamen XML-Datei, es ist eine Liste der beliebtesten Bücher in einer Bibliothek.XML-Filterliste auf berechnetem Verhältnis

Titel eins hat vier Griffe auf zwei Gegenstände, was ein Verhältnis von zwei Halten/Gegenstand ergibt. Titel zwei hat fünf Griffe auf einem Gegenstand, was ein Verhältnis von vier Halten/Gegenstand ergibt, und Titel drei haben ein Verhältnis von fünf Halten/Gegenstand.

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="holdratio3.xsl"?> 
<report> 
<title>Individual Item Display</title> 
<dateCreated>2016-03-29T16:58:57</dateCreated> 
<dateFormat>yyyy/mm/dd</dateFormat> 
<catalog> 
    <marc> 
     <marcEntry tag="245" label="Title" ind="10">Title one</marcEntry> 
    </marc> 
    <call> 
     <item> 
      <numberOfHolds>4</numberOfHolds> 
      <type>LOAN</type> 
     </item> 
     <item> 
      <numberOfHolds>4</numberOfHolds> 
      <type>LOAN</type> 
     </item> 
    </call> 
</catalog> 
<catalog> 
    <marc> 
     <marcEntry tag="245" label="Title" ind="10">Title two</marcEntry> 
    </marc> 
    <call> 
     <item> 
      <numberOfHolds>5</numberOfHolds> 
      <type>LOAN</type> 
     </item> 
    </call> 
</catalog> 
<catalog> 
    <marc> 
     <marcEntry tag="245" label="Title" ind="10">Title three</marcEntry> 
    </marc> 
    <call> 
     <item> 
      <numberOfHolds>4</numberOfHolds> 
      <type>LOAN</type> 
     </item> 
    </call> 
</catalog> 
</report> 

Ich habe ein Stylesheet, das wie folgt aussieht - und es gibt das gewünschte Ergebnis Hold ratio output. Jetzt frage ich mich, ob es nicht möglich ist, es ein wenig mehr zu verfeinern: Ich möchte das Ergebnis filtern, so dass es nur zeigt, wenn das Verhältnis gleich oder größer als drei ist. Ich googelte, konnte aber keine Lösung finden, die genau richtig war - aber ich denke, es ist entweder für-jedes oder für eine Anwendung-Vorlage?

<?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"> 
    <xsl:sort select="call/item/numberOfHolds div count(call/item [type='LOAN'])" order="descending" /> 
    <ratioline> 
     <Title><xsl:value-of select="substring(marc/marcEntry[@tag='245'],1,30)"/></Title> 
     <numberOfHolds><xsl:value-of select="call/item/numberOfHolds"/></numberOfHolds> 
     <numberOfItemsSelectedType><xsl:value-of select="count(call/item[type='LOAN'])"/></numberOfItemsSelectedType> 
      <ratio><xsl:value-of select="format-number(call/item/numberOfHolds div count(call/item[type='FLYTANDE' or type='HEMLAN']), '00.##')" /></ratio> 
     </ratioline> 
    </xsl:for-each> 
    </catalog> 
</xsl:template> 
</xsl:stylesheet> 
+0

"* Titel eines vier hat sich auf zwei Elemente * hält" Warum vier? Es gibt zwei Gegenstände, die jeweils einen eigenen Wert haben - welchen wählen Sie und warum? –

+0

Ja, ich weiß - es ist ein seltsamer Wert, der aus unserem Bibliothekssystem kommt. Der Titel enthält vier Haltepunkte, der Wert wird jedoch für jeden Gegenstand wiederholt. Ein gutes Beispiel für schlechte Formatierung :-( –

Antwort

0

Sie durch die Definition eines Parameter beginnen kann Ihren Wert von 3

<xsl:param name="min" select="3" /> 

filtern auf ihn zu halten, können Sie zunächst eine Variable innerhalb des xsl:for-each definieren das Verhältnis

<xsl:variable name="ratio" select="call/item/numberOfHolds div count(call/item [type='LOAN'])" /> 
zu halten

Dann können Sie eine xsl:if verwenden, um zu testen, ob das Verhältnis größer oder gleich Ihrem Parameter

ist
<xsl:if test="$ratio >= $min"> 

dieses XSLT Versuchen

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:param name="min" select="3" /> 
<xsl:template match="/"> 
    <catalog> 
    <xsl:for-each select="report/catalog"> 
    <xsl:sort select="call/item/numberOfHolds div count(call/item [type='LOAN'])" order="descending" /> 
     <xsl:variable name="ratio" select="call/item/numberOfHolds div count(call/item [type='LOAN'])" /> 
     <xsl:if test="$ratio >= $min"> 
     <ratioline> 
      <Title><xsl:value-of select="substring(marc/marcEntry[@tag='245'],1,30)"/></Title> 
      <numberOfHolds> 
       <xsl:value-of select="call/item/numberOfHolds"/> 
      </numberOfHolds> 
      <numberOfItemsSelectedType> 
       <xsl:value-of select="count(call/item[type='LOAN'])"/> 
      </numberOfItemsSelectedType> 
      <ratio> 
       <xsl:value-of select="format-number($ratio, '00.##')" /> 
      </ratio> 
     </ratioline> 
     </xsl:if> 
    </xsl:for-each> 
    </catalog> 
</xsl:template> 
</xsl:stylesheet>