С xslt работаю впервые. У меня 2.0, но это единственное преимущество, к которому у меня есть доступ к имеющейся у нас библиотеке преобразования C #. Я пытаюсь подсчитать количество дочерних узлов в XML-документе, которые содержат дату более 12 лет назад и имеют определенный атрибут типа.
Пример структуры xml:
<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>
<... />
где <... /> означает дополнительные несвязанные вещи.
По сути, мне нужно количество детей младше 12 лет. (У меня есть количество работающих детей в возрасте до 12 лет, с которыми у меня работают, у меня есть проблемы с детьми младше 12 лет). Подход, который мне предложили, состоял в том, чтобы создать переменную, которая существует 12 лет назад с сегодняшнего дня, и использовать ее в качестве основы для сравнения в функции count(). Это звучит разумно, но я застрял в построении даты без использования сторонних библиотек (например, exslt), которые так часто связаны в подобных вопросах для получения простых и удобных ответов.
Вот xslt, который я получил за это:
<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" />
И это не работает, потому что в поле month-from-dateTime (и предположительно day-from-dateTime) не добавляются начальные нули. На сегодня, 21 марта 2012 г., я возвращаюсь: Saxon.Api.DynamicError: Недействительное значение dateTime "2000-3-21" (месяц должен быть двухзначным) (Ссылка на функцию xpath W3Schools подразумевает, что они должны, но это не так.)
Я хотел бы вывести:
<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" />
Чем больше я бьюсь об это головой, тем больше чувствую, что есть более простой подход, которого я просто не вижу.
Изменить: я очистил синтаксис xslt, поэтому он действителен, а не является строкой С # с двойными кавычками.