【问题标题】:XSLT 1.0 Group ByXSLT 1.0 分组依据
【发布时间】:2010-12-26 14:38:48
【问题描述】:

我有以下 XML 数据:

<?xml version="1.0" encoding="iso-8859-1"?>
<results>
    <result>
        <MemberFirstName>JOHN</MemberFirstName>
        <MemberLastName>DOE</MemberLastName>
        <MemberLogin>1</MemberLogin>
        <Store>0180</Store>
    </result>
    <result>
        <MemberFirstName>JANE</MemberFirstName>
        <MemberLastName>DOE</MemberLastName>
        <MemberLogin>2</MemberLogin>
        <Store>0180</Store>
    </result>
    <result>
        <MemberFirstName>ALAN</MemberFirstName>
        <MemberLastName>SMITH</MemberLastName>
        <MemberLogin>3</MemberLogin>
        <Store>0181</Store>
    </result>
    <result>
        <MemberFirstName>DAVID</MemberFirstName>
        <MemberLastName>GREEN</MemberLastName>
        <MemberLogin>4</MemberLogin>
        <Store>0183</Store>
    </result>
</results>

在 XSLT 1.0 中,我想为每个商店的员工分组并创建一个表。因此在上述数据中,将创建 3 个表。前 2 条记录有两行的表(存储 180)等。

如何在 XSLT 1.0 中做到这一点?

<table id="table">
  <tr class="heading">
    <th scope="col">Member Id</th>
    <th scope="col">First Name</th>
    <th scope="col">Last Name</th>
  </tr>
  <xsl:for-each select="results/result">
    <tr>
      <td><xsl:value-of select="MemberLogin"/></td>
      <td><xsl:value-of select="MemberFirstName"/></td>
      <td><xsl:value-of select="MemberLastName"/></td>
    </tr>
  </xsl:for-each>
</table>

【问题讨论】:

标签: xml xslt group-by


【解决方案1】:

也许更容易理解

   <?xml version="1.0" encoding="utf-8"?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   >

     <xsl:output method="xml" indent="yes"/>      

     <xsl:template match="/results">
       <xsl:apply-templates select="result[not(preceding-sibling::result/Store = Store)]/Store" />
     </xsl:template>

     <xsl:template match="result" >
       <tr>
         <td>
           <xsl:value-of select="MemberLogin"/>
         </td>
         <td>
           <xsl:value-of select="MemberFirstName"/>
         </td>
         <td>
           <xsl:value-of select="MemberLastName"/>
         </td>
       </tr>
     </xsl:template>

     <xsl:template match="Store" >
       <table id="{.}">
         <tr class="heading">
           <th scope="col">Member Id</th>
           <th scope="col">First Name</th>
           <th scope="col">Last Name</th>
         </tr>
         <xsl:variable name="temp" select="." />
         <xsl:apply-templates select="//result[Store = current()]" />
       </table>
     </xsl:template>

   </xsl:stylesheet>

【讨论】:

    【解决方案2】:

    Muenchian grouping 是最好的方法;类似:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    
      <xsl:output method="xml" indent="yes"/>      
      <xsl:key name="groups" match="/results/result" use="Store" />
    
      <xsl:template match="/results">
        <xsl:apply-templates select="result[generate-id() = generate-id(key('groups', Store)[1])]"/>
      </xsl:template>
      <xsl:template match="result">
        <h1><xsl:value-of select="Store"/></h1>
        <table id="{Store}">
          <tr class="heading">
            <th scope="col">Member Id</th>
            <th scope="col">First Name</th>
            <th scope="col">Last Name</th>
          </tr>
          <xsl:for-each select="key('groups', Store)">
            <tr>
              <td><xsl:value-of select="MemberLogin"/></td>
              <td><xsl:value-of select="MemberFirstName"/></td>
              <td><xsl:value-of select="MemberLastName"/></td>
            </tr>
          </xsl:for-each>
        </table>
      </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 我需要根据子节点进行分组,这样可以吗?你能按照我的xml提供样本吗?
    • @jatin - 然后将其包含在选择器中
    猜你喜欢
    • 2020-06-21
    • 2012-03-02
    • 2021-11-20
    • 2018-03-28
    • 2013-03-17
    • 2015-01-02
    • 2012-12-01
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多