首先,这是我的XML的一部分:
<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,我想根据属性“client”的值显示所有项目。我想只使用一个for-each进行此操作,考虑到在我的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 :(得分: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 > 0">
Disney: <xsl:value-of select="$disneyCount" />
</xsl:if>
<xsl:if test="$warnerCount > 0">
Warner: <xsl:value-of select="$warnerCount" />
</xsl:if>
<xsl:if test="$universalCount > 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>