-1

名前が繰り返される場合、パッケージ タイプのノードを削除するにはどうすればよいですか。つまり、最初に出現したものを保持し、他のものを削除する必要があります。package_one という名前がパッケージ ノードで繰り返されていることを確認します。

<?xml version="1.0"?>
<coverage branch-rate="0.53968253968278" branch-total="50" line-rate="0.66864343958488" line-total="2000" timestamp="1346297959" version="gcovr 2.3">
<sources>
    <source>
        ./.
    </source>
</sources>
<packages>
<package branch-rate="0.52380952380967" branch-total="15" line-rate="0.75148257968866" line-total="1000" complexity="0.0" name="package_one">
<classes>
<class branch-rate="0.0" complexity="0.0" filename="eBayBotAPI.cpp" line-rate="0.0" name="BotAPI.cpp">
                <lines>
                    <line branch="false" hits="0" number="128" condition-coverage="100%"/>
                    <line branch="false" hits="0" number="192" condition-coverage="100%"/>                      
                </lines>
            </class>
        </classes>
<class branch-rate="0.5" complexity="0.0" filename="good.cpp" line-rate="1.0" name="good1.cpp">
                <lines>
                    <line branch="false" hits="96" number="8" condition-coverage="100%"/>                       
                </lines>
            </class></package>
    <package branch-rate="0.571428571429" branch-total="10" complexity="0.0" line-rate="0.00593031875463" line-total="1000" name="package_one">
        <classes>
            <class branch-rate="0.0" complexity="0.0" filename="eBayBotAPI.cpp" line-rate="0.0" name="BotAPI.cpp">
                <lines>
                    <line branch="false" hits="0" number="128" condition-coverage="100%"/>                      
                </lines>
            </class>
        </classes>
    </package>      
</packages>

期待される:

<?xml version="1.0"?>
<coverage branch-rate="0.53968253968278" branch-total="50" line-rate="0.66864343958488" line-total="2000" timestamp="1346297959" version="gcovr 2.3">
<sources>
    <source>
        ./.
    </source>
</sources>
<packages><package branch-rate="0.52380952380967" branch-total="15" line-rate="0.75148257968866" line-total="1000" complexity="0.0" name="package_one"><classes>
            <class branch-rate="0.0" complexity="0.0" filename="eBayBotAPI.cpp" line-rate="0.0" name="BotAPI.cpp">
                <lines>
                    <line branch="false" hits="0" number="128" condition-coverage="100%"/>
                    <line branch="false" hits="0" number="192" condition-coverage="100%"/>                      
                </lines>
            </class>
        </classes><class branch-rate="0.5" complexity="0.0" filename="good.cpp" line-rate="1.0" name="good1.cpp">
                <lines>
                    <line branch="false" hits="96" number="8" condition-coverage="100%"/>                       
                </lines>
            </class></package>      
</packages>

4

1 に答える 1

2

I. この単純な XSLT 1.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:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="package[preceding::package]"/>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<coverage branch-rate="0.53968253968278"
 branch-total="50" line-rate="0.66864343958488"
 line-total="2000" timestamp="1346297959" version="gcovr 2.3">
    <sources>
        <source>
        ./.
        </source>
    </sources>
    <packages>
        <package branch-rate="0.52380952380967"
          branch-total="15" line-rate="0.75148257968866"
          line-total="1000" complexity="0.0" name="package_one">
            <classes>
                <class branch-rate="0.0" complexity="0.0"
                 filename="eBayBotAPI.cpp" line-rate="0.0" name="BotAPI.cpp">
                    <lines>
                        <line branch="false" hits="0" number="128" condition-coverage="100%"/>
                        <line branch="false" hits="0" number="192" condition-coverage="100%"/>
                    </lines>
                </class>
            </classes>
            <class branch-rate="0.5" complexity="0.0"
             filename="good.cpp" line-rate="1.0" name="good1.cpp">
                <lines>
                    <line branch="false" hits="96" number="8" condition-coverage="100%"/>
                </lines>
            </class>
        </package>
        <package branch-rate="0.571428571429"
         branch-total="10" complexity="0.0" line-rate="0.00593031875463"
         line-total="1000" name="package_one">
            <classes>
                <class branch-rate="0.0" complexity="0.0"
                 filename="eBayBotAPI.cpp" line-rate="0.0" name="BotAPI.cpp">
                    <lines>
                        <line branch="false" hits="0" number="128" condition-coverage="100%"/>
                    </lines>
                </class>
            </classes>
        </package>
    </packages>
</coverage>

必要な正しい結果が生成されます

<coverage branch-rate="0.53968253968278" branch-total="50" line-rate="0.66864343958488" line-total="2000" timestamp="1346297959" version="gcovr 2.3">
   <sources>
      <source>
        ./.
        </source>
   </sources>
   <packages>
      <package branch-rate="0.52380952380967" branch-total="15" line-rate="0.75148257968866" line-total="1000" complexity="0.0" name="package_one">
         <classes>
            <class branch-rate="0.0" complexity="0.0" filename="eBayBotAPI.cpp" line-rate="0.0" name="BotAPI.cpp">
               <lines>
                  <line branch="false" hits="0" number="128" condition-coverage="100%"/>
                  <line branch="false" hits="0" number="192" condition-coverage="100%"/>
               </lines>
            </class>
         </classes>
         <class branch-rate="0.5" complexity="0.0" filename="good.cpp" line-rate="1.0" name="good1.cpp">
            <lines>
               <line branch="false" hits="96" number="8" condition-coverage="100%"/>
            </lines>
         </class>
      </package>
   </packages>
</coverage>

説明:

アイデンティティ ルールの適切な使用と上書き。


Ⅱ.キーを使用したソリューション:

<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="kElemByName" match="*" use="name()"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "package[not(generate-id()=generate-id(key('kElemByName', name())[1]))]"/>
</xsl:stylesheet>

この変換を同じ XML ドキュメント (上記) に適用すると、同じように正しい結果が得られます。

説明:

同一性規則Muenchian グループ化の両方を適切に使用します。


III. 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="kElemByName" match="*" use="name()"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "package[not(. is (//package)[1])]"/>
</xsl:stylesheet>

説明:

XPath 2.0 演算子の適切な使用法.

于 2012-09-13T04:35:32.190 に答える