Dexter: Verständnisfrage zu Nodes

Hallo,

ich habe nun zu meinem Problem zu meinem Beitrag "Brauche Hilfe für Summenfunktion bei xsl" weiter unten im XSL Bereich eine Lösung gefunden. Nur habe ich eine Verständnisfrage, wie DOM Nodes speziell Childnodes interpretiert.

Folgender Sachverhalt:

<root>
  <produkt1 schalter="003" set="test">13263</produkt1>
  <produkt2 schalter="003" set="test">3284623</produkt1>
  <!-- kommentar -->
  <produkt3 schalter="002" set="test">1231231</produkt1>
  <produkt1 schalter="001" set="test">236486</produkt1>
</root>

Ich setze/schreibe nun per ASP das Attribut "set" mit einem bestimmten Wert, der abhängig von dem Attribut "schalter" ist. die asp steht unten, mir geht es aber eher nur um die eine Schleife, die dafür sorgt, dass alle produkte durchsucht werden:

For Each objField In objRoot.childNodes
     If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
       objField.setAttribute "set", Request.Form(x)
 End If
 Next

Diese Schleife funktioniert nicht, wenn ich in der XML einen Kommentar habe wie oben gezeigt. Wenn ich aber alle Kommentare aus der xml entfern, dann funktioniert die Schleife. Nun möchte ich aber gerne nicht auf die Kommentare verzichten, da diese schon sehr hilfreich sind. Kann mir das einer erklären??

hier die komplette asp und ersichtlich, dass ich als microsoft dom benutze.
<%
Function loadXMLFile(strXMLFile, strXSLFile)
 Dim objXML
 Dim objXSL
 set objXML = Server.CreateObject("Microsoft.XMLDOM")
 objXML.async = false
 objXML.load(strXMLFile)
 set objXSL = Server.CreateObject("Microsoft.XMLDOM")

objXSL.async = false
 objXSL.load(strXSLFile)

Response.Write(objXML.transformNode(objXSL))
End Function

Function updateXML(strXMLFile)

Dim objDom
 Dim objRoot
 Dim objField
 Dim child
 Dim x

set objDOM = Server.CreateObject("Microsoft.XMLDOM")

objDOM.async = false

objDOM.load strXMLFile

Set objRoot = objDom.documentElement

For x = 1 to Request.Form.Count

If instr(1,Request.Form.Key(x),"btn") = 0 Then

For Each objField In objRoot.childNodes

If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
       objField.setAttribute "set", Request.Form(x)

End If

Next
 End If

Next

objDom.save strXMLFile

Set objDom = Nothing
 Set objRoot = Nothing
 Set objField = Nothing

loadXMLFile strXMLFile,server.MapPath("produkt.xsl")
End Function

If Request.Form("btnSubmit") = "" Then
  loadXMLFile server.MapPath("produkt.xml"), _
  server.MapPath("produkt.xsl")
Else
  updateXML server.MapPath("produkt.xml")
End If
%>

  1. Hallo,

    ich habe nun zu meinem Problem zu meinem Beitrag "Brauche Hilfe für Summenfunktion bei xsl" weiter unten im XSL Bereich eine Lösung gefunden. Nur habe ich eine Verständnisfrage, wie DOM Nodes speziell Childnodes interpretiert.

    For Each objField In objRoot.childNodes
         If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
           objField.setAttribute "set", Request.Form(x)
    End If
    Next

    Diese Schleife funktioniert nicht, wenn ich in der XML einen Kommentar habe wie oben gezeigt. Wenn ich aber alle Kommentare aus der xml entfern, dann funktioniert die Schleife. Nun möchte ich aber gerne nicht auf die Kommentare verzichten, da diese schon sehr hilfreich sind. Kann mir das einer erklären??

    root = element node --> enthält als child node:
    produkt* = element node
    kommentar = comment node

    Du kannst oder musst in dem Fall auch auf nodeType (8 ist comment_node) prüfen:
    http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247
    oder http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247

    Grüße
    Thomas

    --
    Surftip: kennen Sie schon Pipolino's Clowntheater?
    http://www.clowntheater-pipolino.net/
    1. Hallo Thomas,

      erst einmal vielen Dank für deine Antwort. Da hat sich jetzt aber wieder fuer mich ein weiteres Tor geöffnet ;-) Aber so richtig weiss ich jetzt nicht, wie ich das in meine Schleife einbinden kann. Wie kann ich die Schleife nur auf element_node also 1 beziehen, so dass er die Attribute nur bei diesen überprüft und das Attribut setzt?
      Vielleicht hast Du ja eine schnelle Lösung bei der Hand, trotzdem danke für deine bisherige Hilfe.

      Hallo,

      ich habe nun zu meinem Problem zu meinem Beitrag "Brauche Hilfe für Summenfunktion bei xsl" weiter unten im XSL Bereich eine Lösung gefunden. Nur habe ich eine Verständnisfrage, wie DOM Nodes speziell Childnodes interpretiert.

      For Each objField In objRoot.childNodes
           If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
             objField.setAttribute "set", Request.Form(x)
      End If
      Next

      Diese Schleife funktioniert nicht, wenn ich in der XML einen Kommentar habe wie oben gezeigt. Wenn ich aber alle Kommentare aus der xml entfern, dann funktioniert die Schleife. Nun möchte ich aber gerne nicht auf die Kommentare verzichten, da diese schon sehr hilfreich sind. Kann mir das einer erklären??

      root = element node --> enthält als child node:
      produkt* = element node
      kommentar = comment node

      Du kannst oder musst in dem Fall auch auf nodeType (8 ist comment_node) prüfen:
      http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#ID-1950641247
      oder http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247

      Grüße
      Thomas

      1. Hallo,

        erst einmal vielen Dank für deine Antwort. Da hat sich jetzt aber wieder fuer mich ein weiteres Tor geöffnet ;-) Aber so richtig weiss ich jetzt nicht, wie ich das in meine Schleife einbinden kann. Wie kann ich die Schleife nur auf element_node also 1 beziehen, so dass er die Attribute nur bei diesen überprüft und das Attribut setzt?
        Vielleicht hast Du ja eine schnelle Lösung bei der Hand, trotzdem danke für deine bisherige Hilfe.

        For Each objField In objRoot.childNodes
             If objField.getAttribute ("schalter") = Request.Form.Key(x) Then
               objField.setAttribute "set", Request.Form(x)
        End If
        Next

        In ASP nicht, aber in JavaScript so in etwa (nur sehr schematsich, aber ich denke, du wirst das für dich adaptieren können):

        var Obj = document.getElementById("root");
        for (i=0; i<Obj.childNodes.length; i++)
         {
          elementNode = Obj.childNodes[i];
          if(elementNode.nodeType == 1)
           {
          ....
         }
        }

        Grüße
        Thomas

        --
        Surftip: kennen Sie schon Pipolino's Clowntheater?
        http://www.clowntheater-pipolino.net/
  2. Hi,

    ein alternativer Ansatz zu Thomas' seinem, wäre, per XPath grundsätzlich
    nur alle Nodes mit dem Namen "produkt" vom Typ "element node" zu erfassen
    und dann in einer fast identischen Schleife zu durchlaufen.

    Ein Tipp noch zum Thema Inkompatibilitäten der MSXML Parserversionen.
    Deine ProgId kann auf der Entwicklungs-Maschine auf eine bestimmte
    MSXML Version verweisen, während auf dem Produktivsystem es auf eine
    andere Version verweist. Dadurch können später schwer vorhersehbare und
    aufspürbare Fehler auftreten.

    Es gibt für die DOM Implementierung auch Versionsspezifische ProgIds wie
    z.b. Microsoft.XmlDomDocument.4.0
    die ich für geeigneter in deinem Fall halte.

    Ciao, Frank

    1. Uh, da wirfst du mir aber jetzt mächtiges Fachchinesisch vor ;-) Ich werde mal einen Fachmann über meinen Code blicken lassen und hoffe der findet dann all die Vebesserungen. Das mit den nur auf produkt zu beschränken geht leider nicht, da es auch andere Bezeichnungen gibt. Aber trotzdem danke für den Hinweis. Wieder etwas schlauer.

      Hi,

      ein alternativer Ansatz zu Thomas' seinem, wäre, per XPath grundsätzlich
      nur alle Nodes mit dem Namen "produkt" vom Typ "element node" zu erfassen
      und dann in einer fast identischen Schleife zu durchlaufen.

      Ein Tipp noch zum Thema Inkompatibilitäten der MSXML Parserversionen.
      Deine ProgId kann auf der Entwicklungs-Maschine auf eine bestimmte
      MSXML Version verweisen, während auf dem Produktivsystem es auf eine
      andere Version verweist. Dadurch können später schwer vorhersehbare und
      aufspürbare Fehler auftreten.

      Es gibt für die DOM Implementierung auch Versionsspezifische ProgIds wie
      z.b. Microsoft.XmlDomDocument.4.0
      die ich für geeigneter in deinem Fall halte.

      Ciao, Frank