基于“筛选”节点的 Xsl 计数



我有以下xml:

<Activity>
     <item>
        <task>XXX</task>
        <assignto>User1</assignto>
     </item>
     <item>
        <task>YYY</task>
        <assignto>User2</assignto>
     </item>
     <item>
        <task>ZZZ</task>
        <assignto>User1</assignto>
     </item>
     <team>
        <member>User1</member>
        <member>User2</member>
     <team>
</Activity>

我想使用 XSL 生成团队中每个成员的任务计数。

用户计数
用户1- 2
用户2- 1

到目前为止,我有以下 XSL:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
    <table>
       <tr>
           <th>User</th>
           <th>Task Count</th>
       </tr>
       <xsl:for-each select="Activity/team/member">
          <tr>
               <td><xsl:value-of select="node()" /></td>
               <td><xsl:value-of select="count(/Activity/item[assignto='user1'])" /></td>
          </tr>
       </xsl:for-each>
    </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

到目前为止,我硬编码了"user1",我想根据每个循环中的当前成员进行过滤。

有人可以帮忙吗?

谢谢

在这里,将成员存储在变量中并对该变量进行测试。源 XML 中也有错误,需要/team。

<xsl:template match="/">
    <html>
        <body>
            <table>
                <tr>
                    <th>User</th>
                    <th>Task Count</th>
                </tr>
                <xsl:for-each select="Activity/team/member">
                    <xsl:variable name="assignto">
                        <xsl:value-of select="."/>
                    </xsl:variable>
                    <tr>
                        <td><xsl:value-of select="node()" /></td>
                        <td><xsl:value-of select="count(/Activity/item[assignto=$assignto])" /></td>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

输出为:

<html>
<body>
  <table>
     <tr>
        <th>User</th>
        <th>Task Count</th>
     </tr>
     <tr>
        <td>User1</td>
        <td>2</td>
     </tr>
     <tr>
        <td>User2</td>
        <td>1</td>
     </tr>
  </table>
</body>
</html>

只需将你对 'user1' 的引用替换为对 XPath 地址开头的当前节点的引用,这是使用 current() 函数完成的:

t:ftemp>type activity.xml 
<Activity>
     <item>
        <task>XXX</task>
        <assignto>User1</assignto>
     </item>
     <item>
        <task>YYY</task>
        <assignto>User2</assignto>
     </item>
     <item>
        <task>ZZZ</task>
        <assignto>User1</assignto>
     </item>
     <team>
        <member>User1</member>
        <member>User2</member>
     </team>
</Activity>
t:ftemp>call xslt activity.xml activity.xsl 
<html>
   <body>
      <table>
         <tr>
            <th>User</th>
            <th>Task Count</th>
         </tr>
         <tr>
            <td>User1</td>
            <td>2</td>
         </tr>
         <tr>
            <td>User2</td>
            <td>1</td>
         </tr>
      </table>
   </body>
</html>
t:ftemp>type activity.xsl 
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
    <table>
       <tr>
           <th>User</th>
           <th>Task Count</th>
       </tr>
       <xsl:for-each select="Activity/team/member">
          <tr>
               <td><xsl:value-of select="node()" /></td>
               <td><xsl:value-of select="count(/Activity/item[assignto=current()])" /></td>
          </tr>
       </xsl:for-each>
    </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
t:ftemp>rem Done! 

如果你想根据当前成员进行过滤,你可以使用 "current()" 函数:

<xsl:value-of select="count(/Activity/item[assignto=current()])" />

但是,您可以在此处使用键来使计数更有效。首先像这样定义你的密钥:

<xsl:key name="item" match="item" use="assignto" />

然后你可以这样写你的计数:

 <xsl:value-of select="count(key('item', .))" />

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="item" match="item" use="assignto" />
    <xsl:template match="/">
    <html>
    <body>
        <table>
           <tr>
               <th>User</th>
               <th>Task Count</th>
           </tr>
           <xsl:for-each select="Activity/team/member">
              <tr>
                   <td><xsl:value-of select="node()" /></td>
                   <td><xsl:value-of select="count(key('item', .))" /></td>
              </tr>
           </xsl:for-each>
        </table>
    </body>
    </html>
    </xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新