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>&numberofchildren=</xsl:text><xsl:value-of select="count(//InsuranceRequest/HealthInsurance/Dependents/Dependent/DependentType[text() = 'Child'])" />
<xsl:text>&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.