在第二级Muenchian分组的(muenchian grouping in the second

2019-07-31 05:12发布

这是我的XML输入

<issues>
  <issue status="open" type="Bug">
    <fix_versions>
      <fix_version>6.14.0</fix_version>
      <fix_version>6.13.0</fix_version>
      <fix_version>6.12.0</fix_version>
    </fix_versions>
    <title>issue1</title>
    <description>Description</description>
  </issue>
  <issue status="open" type="Feature">
    <fix_versions>
      <fix_version>6.13.0</fix_version>
    </fix_versions>
    <title>issue2</title>
    <description>Description</description>
  </issue>
  <issue status="open" type="Improvement">
    <fix_versions>
      <fix_version>6.14.0</fix_version>
    </fix_versions>
    <title>issue3</title>
    <description>Description</description>
  </issue>
  ...
</issues>

这是我的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="versions" match="fix_version" use="."/>
  <xsl:key name="type" match="@type" use="../*/fix_version"/>

  <xsl:template match="fix_version[generate-id()=generate-id(key('versions',.)[1])]">
     <div class="version">
     <a><xsl:value-of select="."/></a>
     <xsl:value-of select="../../@type"/>
       <div class="issues">
         <xsl:for-each select="key('type',.)">
           <div class="{..}">
             <a href="{../title}"><xsl:value-of select="../title"/></a>
           </div>
         </xsl:for-each>
       </div>
     </div>
   </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

我想这样的输出:

<div class="version">
  <a>6.14.0</a>
  <div class="issues">
    <div class="Bugs">
      <a href="issue1">issue1</a>
      <a href="issue7">issue7</a>
      <a href="issue2">issue12</a>
      <a href="issue17">issue17</a>
    </div>
    <div class="Improvements">
      <a href="issue3">issue3</a>
      <a href="issue9">issue9</a>
    </div>
  </div>
</div>
<div class="version">
  <a>6.13.0</a>
  <div class="issues">
    <div class="Bug">
      <a href="issue1">issue1</a>
      <a href="issue11">issue11</a>
    </div>
    <div class="Feature">
      <a href="issue2">issue2</a>
    </div>
  </div>
 </div>
 <div class="version">
   <a>6.12.0</a>
   <div class="issues">
     <div class="Bug">
       <a href="issue1">issue1</a>
     </div>
   </div>
</div>

但我有一个这样的输出:

<div class="version">
  <a>6.14.0</a>
  <div class="issues">
    <div class="Bugs">
      <a href="issue1">issue1</a>
    </div>
    <div class="Bugs">
      <a href="issue7">issue7</a>
    </div>
    <div class="Bugs">
      <a href="issue2">issue12</a>
    </div>
    <div class="Bugs">
      <a href="issue17">issue17</a>
    </div>
    <div class="Improvements">
      <a href="issue3">issue3</a>
    </div>
    <div class="Improvements">
      <a href="issue9">issue9</a>
    </div>
  </div>
</div>
<div class="version">
  <a>6.13.0</a>
  <div class="issues">
    <div class="Bug">
      <a href="issue1">issue1</a>
    </div>
    <div class="Bug">
      <a href="issue11">issue11</a>
    </div>
    <div class="Feature">
      <a href="issue2">issue2</a>
    </div>
  </div>
 </div>
 <div class="version">
   <a>6.12.0</a>
   <div class="issues">
     <div class="Bug">
       <a href="issue1">issue1</a>
     </div>
   </div>
</div>

正如你所看到的问题AR未在名为“臭虫”,“改进”或“功能”的容器分组 - 但是,这是我想要的。 我想这样的东西

但无论我尝试 - 毫无效果。 我真的没有计划如何分组它们。

Answer 1:

我认为你必须让你的钥匙更具体。 当定义在XSLT的关键是对整个XML文档始终定义,而不是部分。 你必须定义一个键时,CONCAT()以上的价值。

Plesae看看这个线程: Muenchian分组的-组的节点中,而不是整个文档中

最好的问候,彼得



Answer 2:

这一转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="versions" match="fix_version" use="."/>
  <xsl:key name="type" match="@type" use="../*/fix_version"/>

  <xsl:template match="fix_version[generate-id()=generate-id(key('versions',.)[1])]">
     <div class="version">
     <a><xsl:value-of select="."/></a>
       <div class="issues">
         <xsl:for-each select="key('type',.)">
           <div class="{.}">
             <a href="{../title}"><xsl:value-of select="../title"/></a>
           </div>
         </xsl:for-each>
       </div>
     </div>
   </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

当施加在提供的XML文档

<issues>
  <issue status="open" type="Bug">
    <fix_versions>
      <fix_version>6.14.0</fix_version>
      <fix_version>6.13.0</fix_version>
      <fix_version>6.12.0</fix_version>
    </fix_versions>
    <title>issue1</title>
    <description>Description</description>
  </issue>
  <issue status="open" type="Feature">
    <fix_versions>
      <fix_version>6.13.0</fix_version>
    </fix_versions>
    <title>issue2</title>
    <description>Description</description>
  </issue>
  <issue status="open" type="Improvement">
    <fix_versions>
      <fix_version>6.14.0</fix_version>
    </fix_versions>
    <title>issue3</title>
    <description>Description</description>
  </issue>
  ...
</issues>

产生想要的,正确的结果

<div class="version">
   <a>6.14.0</a>
   <div class="issues">
      <div class="Bug">
         <a href="issue1">issue1</a>
      </div>
      <div class="Improvement">
         <a href="issue3">issue3</a>
      </div>
   </div>
</div>
<div class="version">
   <a>6.13.0</a>
   <div class="issues">
      <div class="Bug">
         <a href="issue1">issue1</a>
      </div>
      <div class="Feature">
         <a href="issue2">issue2</a>
      </div>
   </div>
</div>
<div class="version">
   <a>6.12.0</a>
   <div class="issues">
      <div class="Bug">
         <a href="issue1">issue1</a>
      </div>
   </div>
</div>


文章来源: muenchian grouping in the second level