2017-03-08 64 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