2017-03-08 61 views
0

第一的價值,這是我的XML的一部分:XSL換每個屬性

<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> 

隨着XSL,我想表明根據屬性「客戶」的價值的所有項目。我想只有一個,每個要做到這一點,考慮到在我的DTD屬性設置是這樣的:

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

例如(我知道@ *客戶端部分是錯誤的):

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

在這裏,我想展示我有多少迪士尼項目,然後有多少華納項目等。

謝謝!

+0

你能告訴你在這種情況下,所期望的輸出。您是否也可以說是否使用XSLT 1.0或XSLT 2.0,因爲這看起來像是一個分組問題,答案會根據您使用的XSLT版本而有所不同。謝謝! –

+0

嗨!我不知道我使用的是哪個版本:/我只是在TextWrangler上創建一個.xsl文件,如果可以的話。 輸出將是: 所以首先我們會看到迪斯尼項目的數量,然後看看華納項目的數量 – chess

回答

0

您不需要for-each,而key確實似乎最有意義。例如:

<?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> 

這將適用於XSLT 1.0或2.0。

http://xsltransform.net/3NSSEvZ

我的假設下,這裏工作,你是不是擔心不符合要求的數據(人們不要按照你DTD),而且你並不一定關心文檔中的順序。如果任一情況並非如此,你可以使用Muenchian像這樣的分組:

<?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