Announcement

Collapse
No announcement yet.

Document() Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Document() Problem

    Hallo!

    Ich arbeite derzeit als Ferialpraktikant und muss mich im Rahmen einer Aufgabenstellung mit XSLT zum ersten mal beschäftigen.

    Ich soll von FxCop erzeugte XML-Dateien auswerten und zählen wie viele Critical Errors, Errors, Critical Warnings und wie viele Warnings pro .dll auftreten.

    Pro .dll habe ich ein XML-File die in etwa so aussehen (nur ein Ausschnitt)

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <?xml-stylesheet type="text/xsl" href="c:\program files\microsoft fxcop 1.36\Xml\FxCopReport.xsl"?>
    <FxCopReport Version="1.36">
     <Namespaces>
      <Namespace Name="Desktop.AcrobatReaderPlugin">
       <Messages>
        <Message Id="Plugin" TypeName="IdentifiersShouldBeSpelledCorrectly" Category="Microsoft.Naming" CheckId="CA1704" Status="Active" Created="2010-07-19 22:59:24Z" FixCategory="Breaking">
         <Issue Name="Namespace" Certainty="75" Level="CriticalWarning">Correct the spelling of 'Plugin' in namespace name 'Desktop.AcrobatReaderPlugin'.</Issue>
        </Message>
       </Messages>
      </Namespace>
     </Namespaces>
     <Targets>
      <Target Name="$(ProjectDir)/../../../bin/release/AcrobatReaderPlugin.dll">
       <Modules>
        <Module Name="acrobatreaderplugin.dll">
         <Messages>
          <Message Id="Plugin" TypeName="IdentifiersShouldBeSpelledCorrectly" Category="Microsoft.Naming" CheckId="CA1704" Status="Active" Created="2010-07-19 22:59:24Z" FixCategory="Breaking">
           <Issue Name="Assembly" Certainty="75" Level="CriticalWarning">Correct the spelling of 'Plugin' in assembly name 'AcrobatReaderPlugin.dll'.</Issue>
          </Message>
         </Messages>
         <Namespaces>
          <Namespace Name="Desktop.AcrobatReaderPlugin">
           <Types>
            <Type Name="AcrobatReader" Kind="Class" Accessibility="Public" ExternallyVisible="True">
             <Members>
              <Member Name="#.ctor(Desktop.DesktopManagement.WindowManagement.Plugins.IDesktop,4.Desktop.AcrobatReaderPlugin.PluginComponent,System.String)" Kind="Method" Static="False" Accessibility="Public" ExternallyVisible="True">
               <Messages>
                <Message Id="plugin" TypeName="IdentifiersShouldBeSpelledCorrectly" Category="Microsoft.Naming" CheckId="CA1704" Status="Active" Created="2010-07-19 22:59:24Z" FixCategory="Breaking">
                 <Issue Name="MemberParameter" Certainty="75" Level="CriticalWarning" Path="e:\BuildServer\build_cmake\desktop\AcrobatReaderPlugin" File="AcrobatReader.cs" Line="25">In method 'AcrobatReader.AcrobatReader(IDesktop, PluginComponent, string)', correct the spelling of 'plugin' in parameter name 'pluginComponent' or remove it entirely if it represents any sort of Hungarian notation.</Issue>
                </Message>
               </Messages>
              </Member>
              <Member Name="#CheckParameter(System.String)" Kind="Method" Static="False" Accessibility="Private" ExternallyVisible="False">
               <Messages>
                <Message TypeName="MarkMembersAsStatic" Category="Microsoft.Performance" CheckId="CA1822" Status="Active" Created="2010-07-19 22:59:24Z" FixCategory="NonBreaking">
                 <Issue Certainty="95" Level="Warning" Path="e:\BuildServer\build_cmake\desktop\AcrobatReaderPlugin" File="AcrobatReader.cs" Line="54">The 'this' parameter (or 'Me' in Visual Basic) of 'AcrobatReader.CheckParameter(string)' is never used. Mark the member as static (or Shared in Visual Basic) or use 'this'/'Me' in the method body or at least one property accessor, if appropriate.</Issue>
                </Message>
               </Messages>
              </Member>
             </Members>
            </Type>
            <Type Name="Plugin" Kind="Class" Accessibility="Assembly" ExternallyVisible="False">
             <Members>
              <Member Name="#param" Kind="Field" Static="False" Accessibility="Private" ExternallyVisible="False">
               <Messages>
                <Message TypeName="AvoidUnusedPrivateFields" Category="Microsoft.Performance" CheckId="CA1823" Status="Active" Created="2010-07-19 22:59:24Z" FixCategory="NonBreaking">
                 <Issue Certainty="75" Level="Warning">It appears that field 'Plugin.param' is never used or is only ever assigned to. Use this field or remove it.</Issue>
                </Message>
               </Messages>
              </Member>
             </Members>
            </Type>
            <Type Name="PluginComponent" Kind="Class" Accessibility="Public" ExternallyVisible="True">
             <Messages>
              <Message Id="Plugin" TypeName="IdentifiersShouldBeSpelledCorrectly" Category="Microsoft.Naming" CheckId="CA1704" Status="Active" Created="2010-07-19 22:59:24Z" FixCategory="Breaking">
               <Issue Name="Type" Certainty="75" Level="CriticalWarning">Correct the spelling of 'Plugin' in type name 'PluginComponent'.</Issue>
              </Message>
             </Messages>
             <Members>
              <Member Name="#isInitialized" Kind="Field" Static="False" Accessibility="Private" ExternallyVisible="False">
               <Messages>
                <Message TypeName="AvoidUnusedPrivateFields" Category="Microsoft.Performance" CheckId="CA1823" Status="Active" Created="2010-07-19 22:59:24Z" FixCategory="NonBreaking">
                 <Issue Certainty="75" Level="Warning">It appears that field 'PluginComponent.isInitialized' is never used or is only ever assigned to. Use this field or remove it.</Issue>
                </Message>
               </Messages>
              </Member>
             </Members>
            </Type>
           </Types>
          </Namespace>
         </Namespaces>
        </Module>
       </Modules>
      </Target>
    Da ich mehrere Files habe über die ich die Daten erfassen muss, habe ich mir eine einfache XML Datei geschrieben in der die einzelnen Namen der auszuwertenden Files stehen.

    Hier ein Ausschnitt meiner .xls Datei

    Code:
      <xsl:template match="/">
        <table width="90%" style="border:2px solid black;">
          <xsl:for-each select="/Files/Filename">
            <xsl:variable name="filename" select="string(.)"/>
    
            <xsl:for-each select="document($filename)">
              <tr>
                <xsl:variable name="AnzCritErr" select="count(//Issue[@Level='CriticalError'])"></xsl:variable>
                <xsl:variable name="AnzErr" select="count(//Issue[@Level='Error'])"></xsl:variable>
                <xsl:variable name="AnzCritWar" select="count(//Issue[@Level='CriticalWarning'])"></xsl:variable>
                <xsl:variable name="AnzWar" select="count(//Issue[@Level='Warning'])"></xsl:variable>
    
                <!--Filename-->
                <td>
                  <font face="Tahoma" size="-1">
                    <xsl:value-of select="//Module/@Name"/>
                  </font>
                </td>
    Problem an der ganzen Sache ist, dass "count(//Issue[@Level='CriticalError'])" und alle anderen counts 0 ergeben.
    Kann man in einem Document "//" nicht verwenden?

    Bitte beachten: Absolute Angabe mit zB: "Targets/Target/Modules/Module/Messages/Message" wäre möglich, jedoch werden nicht ALLE Issues gefunden, da unter "Namespaces/Namespace/Messages/Message" sich auch noch welche befinden, das XML-File ist also anscheinend schlecht strukturiert...

    Kann mir jemand weiterhelfen?

    LG
    Chri
    Zuletzt editiert von Chri; 22.07.2010, 13:49.

  • #2
    Mögliche Gründe, dass Knoten per XPath nicht gefunden werden, können XML-Namensräume sein und bei der Benutzung der 'document'-Funktion auch ein falscher Datei-Pfad.
    Namensräume sehe ich in deinem XML nicht, aber über die Pfade hast du keine Angaben gemacht.
    Um das zu debuggen, müsste man das primäre Eingabedokument sehen und wissen, wo sich das Stylesheet im Verhältnis zu den Dateien befindet, die per document-Aufruf geladen werden sollen.

    Comment


    • #3
      Sowohl die xml als auch die xsl Dateien liegen alle im selben Ordner. Ich denke nicht, dass dadurch der Fehler verursacht wird.

      Wie schon gesagt wenn ich, "<xsl:for-each select="document($filename)Targets/Target/Modules/Module/Messages/Message">" angebe funktioniert das ganze ja...

      hmm Namensräume? Ich hab mich nicht sonderlich lange mit XML/XSL beschäftigt, was genau könnte da ein Problem sein?

      LG
      Chri

      Comment

      Working...
      X