XSL for-each具有属性的值

时间:2017-03-08 15:25:19

标签: xml xslt

首先,这是我的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>

在这里,我想展示我有多少迪士尼项目,然后有多少华纳项目等等。

谢谢!

1 个答案:

答案 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 &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