xslt删除子节点和父节点中的重复项

时间:2015-05-20 10:36:23

标签: xml xslt

我有以下xml文件类型并使用xslt-template我尝试创建一个html-Report:

  <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<testmodule >
  <testgroup>
    <testgroup>
      <testcase >
        <teststep result="pass">=&gt;  
            <CRID Name="Cleese" CR-ID="CR#1234" TimeStamp="20150520 0122" Backcolor="White" />
        </teststep>
        <teststep  result="pass">=&gt;: 
            <CRID Name="Cleese" CR-ID="CR#123" TimeStamp="20150520 0122" Backcolor="White" />
        </teststep>
        <verdict time="" timestamp="" endtime="" endtimestamp="" result="pass" />
        <ident>Testcase1</ident>
        <CRID Name="Cleese" CR-ID="CR#123" TimeStamp="20150520 0123" Backcolor="White" />
      </testcase>
      <testcase >
        <teststep result="pass"> 
            <CRID Name="Cleese" CR-ID="CR#1234" TimeStamp="20150520 0123" Backcolor="White" />
        </teststep>
        <teststep result="pass">=&gt; 
            <CRID Name="Cleese" CR-ID="CR#1234" TimeStamp="20150520 0123" Backcolor="White" />
        </teststep>
        <teststep  result="pass">=&gt; 
            <CRID Name="Cleese" CR-ID="CR#1234" TimeStamp="20150520 0122" Backcolor="White" />
        </teststep>
        <verdict  result="pass" />
        <ident>Testcase2</ident>
        <CRID Name="Cleese" CR-ID="CR#1234" TimeStamp="20150520 0123" Backcolor="White" />
      </testcase>
      <testcase >
        <testlogfile file="" />
        <teststep  result="pass">=&gt; Result: 
            <CRID Name="Cleese" CR-ID="CR#123" TimeStamp="20150520 0123" Backcolor="White" />
        </teststep>
        <verdict  result="pass" />
        <ident>Testcase3</ident>
        <CRID Name="Cleese" CR-ID="CR#1234" TimeStamp="20150520 0123" Backcolor="White" />
      </testcase>
      <title>1.3 Group</title>
    </testgroup>
    <title>1. Group</title>
  </testgroup>
  <verdict time="" timestamp="" endtime="" endtimestamp="" result="pass" />
  <title>Testmodul</title>
</testmodule>

我想要实现的是在html文件中删除具有CR-ID属性的重复条目。我尝试使用&#34; Muenchian方法&#34;但实际上却失败了。

所以我看到了另一个代码片段,并尝试调整它,但它不起作用。它删除了所有重复项,但我只想删除每个测试用例的副本。 这是.xslt-Template的一部分:

    <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
         <xsl:template match="testcase" mode="overview">
                <xsl:for-each select="descendant::CRID[not(@CR-ID=preceding::CRID/@CR-ID)]">
                    <xsl:if test="@CR-ID !=''">
                        <xsl:element name="br"/>
                        <xsl:value-of select="@CR-ID" />
                    </xsl:if>
                </xsl:for-each>
          </xsl:template>

我遇到的问题是属性&#34; CR-ID&#34;可以在&#34; teststep&#34;或者在&#34; testcase&#34;。所以有些条目被删除了。

想要的输出只是在我的html中给我以下条目:

  • testcase 1:仅CR#1234,CR#123
  • testcase 2:仅CR#1234
  • testcase 3:仅CR#1234,CR#123

Html代码应该像:

<td>1.1.1</td>
            <td >Testcase1</td>
            <td ><br>CR#1234<br>CR#123</td>
            <td>-</td>
          </tr>
          <tr>
            <td >1.1.2</td>
            <td >Testcase2</td>
            <td ><br>CR#1234</td>
            <td >-</td>
          </tr>
          <tr>
            <td >1.1.3</td>
            <td >Testcase3</td>
            <td ><br>CR#1234<br>CR#123</td>
            <td ">-</td>

&#34; CR#1234&#34;和&#34; CR#123&#34;从xml文件中使用。使用我发布的xslt代码,只有testcase1获得CR#,其他为空/空。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

使用Muenchian分组,您需要使用属性连接ident:

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

    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:key name="group" match="testcase//CRID" use="concat(ancestor::testcase/ident, '|', @CR-ID)"/>

    <xsl:template match="/">
      <html>
        <head>
          <title>Example</title>
        </head>
        <body>
            <xsl:apply-templates/>
        </body>       
      </html>
    </xsl:template>

    <xsl:template match="root">
        <ul>
            <xsl:apply-templates/>
        </ul>
    </xsl:template>

    <xsl:template match="testcase">
        <li>
            <xsl:value-of select="concat(ident, ': ')"/>
            <xsl:apply-templates select=".//CRID[generate-id() = generate-id(key('group', concat(ancestor::testcase/ident, '|', @CR-ID))[1])]"/>
        </li>
    </xsl:template>

    <xsl:template match="CRID">
        <xsl:if test="position() > 1">, </xsl:if>
        <xsl:value-of select="@CR-ID"/>
    </xsl:template>
</xsl:transform>

改变

<root>
    <testcase>
    <teststep>
        <CRID Name="Cleese" CR-ID="CR#1234"/> 
    </teststep>
        <teststep>
        <CRID Name="Cleese" CR-ID="CR#123"/> 
    </teststep>
        <teststep>
        <CRID Name="Cleese" CR-ID="CR#1234"/> 
    </teststep>
    <ident>Testcase1</ident>
</testcase>
<testcase>
    <teststep>
        <CRID Name="Cleese" CR-ID="CR#1234"/> 
    </teststep>
        <teststep>
        <CRID Name="Cleese" CR-ID="CR#123"/> 
    </teststep>
    <CRID Name="Cleese" CR-ID="CR#1234"/> 
    <ident>Testcase2</ident>
</testcase>
<testcase>
    <teststep>
        <CRID Name="Cleese" CR-ID="CR#1234"/> 
    </teststep>
        <teststep>
        <CRID Name="Cleese" CR-ID="CR#123"/> 
    </teststep>
        <teststep>
        <CRID Name="Cleese" CR-ID="CR#1234"/> 
    </teststep>
    <CRID Name="Cleese" CR-ID="CR#123"/> 
    <ident>Testcase3</ident>
</testcase>
</root>

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

      <title>Example</title>
   </head>
   <body>
      <ul>

         <li>Testcase1: CR#1234, CR#123</li>

         <li>Testcase2: CR#1234, CR#123</li>

         <li>Testcase3: CR#1234, CR#123</li>

      </ul>
   </body>
</html>