2017-03-08 3 views
0

Als erstes ist hier ein Teil meines XML:XSL für-die jeweils mit dem Wert des Attributs

<BASE> 
    <project client="Disney" num="DN001" type="film"> 
     <title>Moana</title> 
    </project> 
    <project client="Disney" num="DN002" type="trailer"> 
     <title>The BFG</title> 
    </project> 
    <project client="Warner" num="WN001" type="film"> 
     <title>Batman</title> 
    </project> 
</BASE> 

Mit XSL, ich will alle Projekte zeigen, entsprechend dem Wert des Attributs „Client“. Ich möchte dies für-alle mit nur einem tun, wenn man bedenkt, dass das Attribut in meinen DTD wie folgt festgelegt ist:

<!ATTLIST project 
    client (Disney|Warner|Universal) #REQUIRED 
    num CDATA #REQUIRED 
    type (film|trailer) #REQUIRED> 

Zum Beispiel (ich weiß, das @ * Client-Teil falsch ist):

<xsl:for-each select="./project/@*client"> 
<xsl:value-of select="count(//../project/@*client)"/> 
</xsl:for-each> 

Hier möchte ich zeigen, wie viele Disney-Projekte ich habe, dann wie viele Warner-Projekte, etc.

Vielen Dank !!

+0

zeigen Sie die Ausgabe, die Sie in diesem Fall erwarten. Können Sie auch sagen, wenn Sie XSLT 1.0 oder XSLT 2.0 verwenden, da dies wie ein Gruppierungsproblem aussieht, und die Antwort hängt davon ab, welche Version von XSLT Sie verwenden. Vielen Dank! –

+0

Hallo! Ich habe keine Ahnung, welche Version ich verwende:/Ich erstelle gerade eine .xsl-Datei auf TextWrangler, wenn das helfen kann. Die Ausgabe wäre: So zuerst sehen wir die Menge der Disney-Projekte und dann die Menge der Warner-Projekte – chess

Antwort

0

Sie brauchen keine for-each, und eine key scheint wirklich am sinnvollsten zu sein. Zum Beispiel:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" encoding="UTF-8" indent="yes" /> 
    <xsl:key name="client-key" match="project" use="@client" /> 
    <xsl:template match="/"> 
     <xsl:variable name="disneyCount" select="count(key('client-key', 'Disney'))" /> 
     <xsl:variable name="warnerCount" select="count(key('client-key', 'Warner'))" /> 
     <xsl:variable name="universalCount" select="count(key('client-key', 'Universal'))" /> 

     <xsl:if test="$disneyCount &gt; 0"> 
      Disney: <xsl:value-of select="$disneyCount" /> 
     </xsl:if> 

     <xsl:if test="$warnerCount &gt; 0"> 
      Warner: <xsl:value-of select="$warnerCount" /> 
     </xsl:if> 

     <xsl:if test="$universalCount &gt; 0"> 
      Universal: <xsl:value-of select="$universalCount" /> 
     </xsl:if> 
    </xsl:template> 
</xsl:transform> 

Dies funktioniert mit XSLT 1.0 oder 2.0.

http://xsltransform.net/3NSSEvZ

Ich bin Betrieb hier unter der Annahme, dass Sie nicht konformen Daten nicht betroffen sind (die Menschen nach Ihrer DTD nicht), und dass Sie nicht unbedingt besorgt über die Reihenfolge im Dokument . Wenn auch nicht der Fall ist, könnten Sie Muench wie so Gruppierung verwenden:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" encoding="UTF-8" indent="yes" /> 
    <xsl:key name="client-key" match="project" use="@client" /> 
    <xsl:template match="/">   
     <xsl:for-each select="//project[count(. | key('client-key', @client)[1]) = 1]"> 
      <xsl:value-of select="@client" />: <xsl:value-of select="count(key('client-key', @client))" />;   
     </xsl:for-each>   
    </xsl:template> 
</xsl:transform> 

http://xsltransform.net/6rewNz2

Verwandte Themen