Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XSLT 1.0 Datumsvergleiche (https://www.delphipraxis.net/192908-xslt-1-0-datumsvergleiche.html)

creehawk 31. Mai 2017 16:29

XSLT 1.0 Datumsvergleiche
 
Moin Moin.

Delphi 10.1 Starter, MSXML 6.0, Windows 7, Kaffee, Pizza.

Ich habe hier eine XML Datei mit 3401 Einträgen, die so aussehen:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<VTL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="VTL.XSD">
 <Vertrag>
  <BPANR>280126979</BPANR>
  <Vertragsnummer>660258</Vertragsnummer>
  <Vertragsdatum>2011-04-19</Vertragsdatum>
  <Vertragsleitzahl>360 490 488</Vertragsleitzahl>
  <Geräteleitzahl>788 465 420</Geräteleitzahl>
  <Laufzeit>24</Laufzeit>
 </Vertrag>
Das Schema dazu:
Code:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="VTL">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Vertrag" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:int" name="BPANR"/>
              <xs:element type="xs:int" name="Vertragsnummer"/>
              <xs:element type="xs:date" name="Vertragsdatum"/>
              <xs:element type="xs:string" name="Vertragsleitzahl"/>
              <xs:element type="xs:string" name="Geräteleitzahl"/>
              <xs:element type="xs:int" name="Laufzeit"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
Ich würde jetzt gerne alle Verträge eines bestimmten Zeitraumes per XSLT 1.0 (2.0 geht nicht) herausfischen.

Die XSL Datei
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
   <VTL>
    <xsl:for-each select="VTL/Vertrag">
    <xsl:if test="Vertragsdatum &gt; 2011-04-19 and Vertragsdatum &lt; 2011-04-23">   
     <Vertrag>
      <BPANR><xsl:value-of select="BPANR"/></BPANR>
     </Vertrag>
    </xsl:if>
    </xsl:for-each>
   </VTL>
</xsl:template>
</xsl:stylesheet>

Die XSLT rufe ich so auf

Code:
function Transform(XMLContent : string; XSLContent : string) : WideString;
var
  xmlSource, xslQuery, xmlResult : IXMLDOMDocument;
begin
  xmlSource := CoDOMDocument.Create;
  xslQuery := CoDOMDocument.Create;
  xmlResult := CoDOMDocument.Create;
  xmlSource.load(XMLContent);
  xslQuery.load(XSLContent);
  xmlResult.loadXML(xmlSource.transformNode(xslQuery));
  XMLResult.save(PrgPath + 'XML\Result.xml');
end;
Das bringt mal überhaupt nichts. Irgendwo ist da wohl wieder ein Date Problem. Oder nicht? Oder was?

creehawk

hoika 31. Mai 2017 18:12

AW: XSLT 1.0 Datumsvergleiche
 
Hallo,
vielleicht fehlen ja auch nur Klammern beim Vergleich?

creehawk 31. Mai 2017 18:24

AW: XSLT 1.0 Datumsvergleiche
 
Danke für den Vorschlag, aber Nee, leider nicht.

Wenn ich nur den größer als Vergleich setze geht es auch nicht. Wenn ich das Datum in Hochkommas setze auch nicht, ist dann ein String, wobei dann ist gleich natürlich funktioniert.

Ich muss vermutlich das Element Vertragsdatum und den Vergleichswert als DATE Typ rüberbringen, aber eben wie?

creehawk

Fritzew 31. Mai 2017 18:45

AW: XSLT 1.0 Datumsvergleiche
 
Vielleicht hilft Dir das weiter?

https://stackoverflow.com/questions/...-compare-dates

creehawk 31. Mai 2017 19:02

AW: XSLT 1.0 Datumsvergleiche
 
Und wieder : Nee, leider nicht.

Ich bin gezwungen den XSLT 1.0 Prozessor zu verwenden. Der versteht sich wieder an entscheidender Stelle nicht mit EXSLT.

Ich kann mir winfach nicht vorstellen das eine der grundlegensten Abgleiche für Datensammlungen mit den gegebenen Möglichkeiten von MSXML und XSLT/XPATH nicht machbar sein sollen.

Wobei innerhalb von Delphi eine XPath Aktion funktioniert:

Code:
procedure TMain.DatumsabfrageClick(Sender: TObject);
Var
I:Integer;
Counter:Integer;
Datum1:String;
Datum2:String;
SearchValue1:String;
SearchValue2:String;
begin
  begin
    Datum1 :=(DateTimeToStr(Main.CalendarPicker1.Date));
    Datum2 :=(DateTimeToStr(Main.CalendarPicker2.Date));
    SearchValue1:=(copy(Datum1,7,4)+'-'+copy(Datum1,4,2)+'-'+Copy(Datum1,0,2));
    SearchValue2:=(copy(Datum2,7,4)+'-'+copy(Datum2,4,2)+'-'+Copy(Datum2,0,2));
    Counter := VTLList.SelectNodes('//Vertrag[Vertragsdatum >= "' + SearchValue1+'" and Vertragsdatum <= "' + SearchValue2+'"]').Length;
    Main.Datumsabfrage.Caption:=IntToStr(Counter) + ' Verträge';
  end;
CreateXSLT;
end;
creehawk

creehawk 31. Mai 2017 19:02

AW: XSLT 1.0 Datumsvergleiche
 
Wobei ich auch gerade sehe das ich da Strings vergleiche .....

Fritzew 31. Mai 2017 19:12

AW: XSLT 1.0 Datumsvergleiche
 
Schau Dir die Antworten in dem Link von oben noch mal an,
ich denke da ist was für Dich dabei

creehawk 1. Jun 2017 05:04

AW: XSLT 1.0 Datumsvergleiche
 
Moin Moin.

Die Angelegenheit mit dem numerischen Vergleich meinst du sicher, Bindestriche raus und so.

Schon klar. Dafür muss ich aber EXSLT verwenden. Geht nicht.

Tja, da muss ich also mal weiter rumsuchen.


Creehawk

creehawk 1. Jun 2017 09:34

AW: XSLT 1.0 Datumsvergleiche
 
Heiliger BimBam.

Ich brauche EXSLT ja gar nicht, translate gehört zu XSLT 1.0.........

Ich brauche Urlaub. Das hätte ich auch alles selber finden können. Andererseits: Danke für die Antworten, denn die haben mein vernageltes Hirn auf den Weg gebracht.

creehawk

Fritzew 1. Jun 2017 09:55

AW: XSLT 1.0 Datumsvergleiche
 
Zitat:

Zitat von creehawk (Beitrag 1373192)
Heiliger BimBam.

Ich brauche EXSLT ja gar nicht, translate gehört zu XSLT 1.0.........

Ich brauche Urlaub. Das hätte ich auch alles selber finden können. Andererseits: Danke für die Antworten, denn die haben mein vernageltes Hirn auf den Weg gebracht.

creehawk

Wollte ich Dir gerade schreiben.... :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz