3

XML Subversion コミットのログを記録する:

<?xml version="1.0"?>
<log>
<logentry
   revision="1236">
<author>me</author>
<date>2011-11-25T08:28:57.024571Z</date>
<msg>JIRA-5678: commit message</msg>
</logentry>
<logentry
   revision="1235">
<author>me</author>
<date>2011-11-25T08:28:47.024571Z</date>
<msg>JIRA-5678 - commit2 message</msg>
</logentry>
<logentry
   revision="1234">
<author>me</author>
<date>2011-11-25T08:28:37.024571Z</date>
<msg>JIRA-5678 commit3 message</msg>
</logentry>
</log>

次のような、JIRA 番号でグループ化されたレポートを生成したいと考えています。

<table>
<tr><th>revision</th><th>comment</th></tr>
<tr><td colspan=2>JIRA-5678</td></tr>
<tr><td>r1236</td><td>JIRA-5678: commit message</td></tr>
<tr><td>r1235</td><td>JIRA-5678 - commit2 message</td></tr>
<tr><td>r1234</td><td>JIRA-5678 commit3 message</td></tr>
</table>

JIRA 番号を抽出して別の列に出力する変換:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">

<xsl:template match="/">
  <table summary="JIRAs">
    <tr>
      <th>JIRA#</th>
      <th>revision</th>
      <th>message</th>
    </tr>

  <xsl:for-each select="log/logentry[starts-with(msg,'JIRA-')]">
    <tr>
      <td><xsl:value-of select="fn:replace(msg,'^(JIRA-\d+).*$', '$1')" /></td>
      <td><xsl:value-of select="@revision" /></td>
      <td><xsl:value-of select="msg" /></td>
    </tr>
  </xsl:for-each>

  </table>
</xsl:template>

</xsl:stylesheet>

この種のグループ化を行うための XSLT コードは何でしょうか?

更新: XML DOM の上に python スクリプトを書くことになりました。必要な場合はコメントを残してください。

4

1 に答える 1

5

I.このXSLT1.0変換

<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="kEntryByNum" match="logentry" use="substring-before(msg, ':')"/>

 <xsl:template match="/*">
     <table>
       <tr><th>revision</th><th>comment</th></tr>

       <xsl:apply-templates select=
        "logentry
           [generate-id()
           =
            generate-id(key('kEntryByNum', substring-before(msg, ':'))[1])
           ]
      "/>
     </table>
 </xsl:template>

 <xsl:template match="logentry">
        <tr><td colspan="2"><xsl:value-of select="substring-before(msg, ':')"/></td></tr>
        <xsl:for-each select="key('kEntryByNum', substring-before(msg, ':'))">
            <tr>
                <td><xsl:value-of select="@revision"/></td>
                <td><xsl:value-of select="msg"/></td>
            </tr>
        </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

次のXMLドキュメントに適用した場合

<log>
    <logentry revision="1236">
        <author>me</author>
        <date>2011-11-25T08:28:57.024571Z</date>
        <msg>JIRA-5678: commit message</msg>
    </logentry>
    <logentry revision="1237">
        <author>me</author>
        <date>2011-11-25T08:28:57.024571Z</date>
        <msg>JIRA-5679: commit message</msg>
    </logentry>
    <logentry revision="1238">
        <author>me</author>
        <date>2011-11-25T08:28:57.024571Z</date>
        <msg>JIRA-5679: commit message</msg>
    </logentry>
    <logentry revision="1235">
        <author>me</author>
        <date>2011-11-25T08:28:47.024571Z</date>
        <msg>JIRA-5678: - commit2 message</msg>
    </logentry>
    <logentry revision="1234">
        <author>me</author>
        <date>2011-11-25T08:28:37.024571Z</date>
        <msg>JIRA-5678: commit3 message</msg>
    </logentry>
</log>

必要な正しい結果を生成します

<table>
   <tr>
      <th>revision</th>
      <th>comment</th>
   </tr>
   <tr>
      <td colspan="2">JIRA-5678</td>
   </tr>
   <tr>
      <td>1236</td>
      <td>JIRA-5678: commit message</td>
   </tr>
   <tr>
      <td>1235</td>
      <td>JIRA-5678: - commit2 message</td>
   </tr>
   <tr>
      <td>1234</td>
      <td>JIRA-5678: commit3 message</td>
   </tr>
   <tr>
      <td colspan="2">JIRA-5679</td>
   </tr>
   <tr>
      <td>1237</td>
      <td>JIRA-5679: commit message</td>
   </tr>
   <tr>
      <td>1238</td>
      <td>JIRA-5679: commit message</td>
   </tr>
</table>

II。XSLT 2.0ソリューション

<xsl:stylesheet version="2.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="kEntryByNum" match="logentry" use="substring-before(msg, ':')"/>

 <xsl:template match="/*">
     <table>
       <tr><th>revision</th><th>comment</th></tr>

       <xsl:for-each-group select="logentry" group-by="substring-before(msg, ':')">
         <xsl:apply-templates select="."/>
       </xsl:for-each-group>
     </table>
 </xsl:template>

 <xsl:template match="logentry">
        <tr><td colspan="2"><xsl:value-of select="substring-before(msg, ':')"/></td></tr>
        <xsl:for-each select="current-group()">
            <tr>
                <td><xsl:value-of select="@revision"/></td>
                <td><xsl:value-of select="msg"/></td>
            </tr>
        </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>
于 2012-05-02T13:36:56.647 に答える