2 Stimmen

XML-Zählung auf der Grundlage von Datumsbedingungen mit xslt

Ich arbeite zum ersten Mal mit xslt. Ich habe 2.0, aber das ist ungefähr der einzige Vorteil, den ich mit der c#-Transformationsbibliothek, die wir haben, zugreifen kann. Ich versuche, eine Anzahl von untergeordneten Knoten im XML-Dokument zu zählen, die ein Datum vor mehr als 12 Jahren enthalten und ein bestimmtes Typ-Attribut haben.

Beispiel einer xml-Struktur:

<xml version=\"1.0\" encoding=\"utf-8\"?>
<... />
<Dependents>
<Dependent><DOB>1964-04-01</DOB><DependentType>Spouse</DependentType></Dependent>
<Dependent><DOB>2000-01-01</DOB><DependentType>Child</DependentType></Dependent>
<Dependent><DOB>2012-01-01</DOB><DependentType>Child</DependentType></Dependent>
</Dependents>
<... />

donde <... /> bedeutet einige zusätzliche, nicht verwandte Dinge.

Im Wesentlichen möchte ich also die Anzahl der Kinder unter 12 Jahren wissen (die Zählung von dependenttype = child of all ages funktioniert, nur die unter 12-Jährigen bereiten mir Probleme). Der Ansatz, der mir vorgeschlagen wurde, war, eine Variable zu konstruieren, die für 12 Jahre vor heute steht, und diese als Basis für den Vergleich in der count() Funktion. Das klingt vernünftig, aber ich stecke fest, das Datum ohne die Verwendung von 3rd-Party-Bibliotheken (z. B. exslt) zu konstruieren, die so oft in Fragen wie diese für die einfache, handy-dandy Antworten verknüpft sind.

Die Xslt, die ich bisher dafür erhalten habe, lautet:

<xsl:variable name="today" select="current-dateTime()" as="xs:dateTime" />
<xsl:variable name="twelveyearsago" select="xs:dateTime(concat(year-from-dateTime($today) - 12, '-', month-from-dateTime($today), '-', day-from-dateTime($today)))" />
<xsl:text>12yearsago=</xsl:text><xsl:value-of select="$twelveyearsago" />

Und es funktioniert nicht, weil die month-from-dateTime (und vermutlich day-from-dateTime) keine führenden Nullen hinzufügen. Für heute, den 21. März 2012, erhalte ich zurück: Saxon.Api.DynamicError : Ungültiger dateTime-Wert "2000-3-21" (Monat muss zweistellig sein) (Die W3Schools xpath Funktion Referenz impliziert, dass sie debe aber das tun sie nicht.)

Was ich gerne ausgeben würde, ist:

<xsl:text>&amp;numberofchildren=</xsl:text><xsl:value-of select="count(//InsuranceRequest/HealthInsurance/Dependents/Dependent/DependentType[text() = 'Child'])" />
<xsl:text>&amp;childrenunder12=</xsl:text><xsl:value-of select="children under twelve" />

Je mehr ich mir den Kopf darüber zerbreche, desto mehr habe ich das Gefühl, dass es einen einfacheren Ansatz gibt, den ich einfach nicht sehe.

Bearbeiten: Ich bereinigte die xslt-Syntax, so dass es gültig ist und nicht eine doppelt zitierte c# Zeichenfolge.

3voto

Martin Honnen Punkte 148915

Sie können einfach eine Subtraktion von Dauer von 12 Jahren wie in <xsl:variable name="twelveyearsago" select="$today - xs:yearMonthDuration('P12Y')"/> verwenden, dann z.B. //Dependent[DependentType = 'Child' and xs:date(DOB) >= $twelveyearsago] .

[Bearbeiten] Hier ist eine Vorlage, die mit Saxon 9.4 kompiliert und ausgeführt werden kann:

  <xsl:template match="/">
    <xsl:variable name="today" select="current-date()"/>
    <xsl:variable name="twelve-years-ago" select="$today - xs:yearMonthDuration('P12Y')"/>
    <xsl:value-of select="count(//Dependent[DependentType = 'Child' and xs:date(DOB) >= $twelve-years-ago])"/>
  </xsl:template>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X