Я должен определить входное значение, имеющее формат даты дд-ммм-гггг. Если я смогу найти, будет ли установлен какой-либо атрибут на основе атрибута, я могу сделать формат в классе обработки отчетов С#.
<td>
<xsl:if test = "To write expression to match the value">
<r>
<xyz:value-of select = "'Set Value'" />
</r>
</xsl:if>
</td>
Вводимое значение: «30 июня 2019 г.». Если это соответствует, я хочу установить . В основном у меня есть набор столбцов в отчете. Я должен идентифицировать значения в отчете, если значение соответствует формату даты dd-mmm-yyy, устанавливая некоторый атрибут в xslt и применяя тот же формат в коде синтаксического анализатора отчета, который написан на С#
Вводимое значение: «30 июня 2019 г.». Если он совпадает, я хочу установить <xyz:value-of select = "'DateFormateToBeCorrected'" />. В основном у меня есть набор столбцов в отчете. Я должен идентифицировать значения в отчете, если значение соответствует формату даты dd-mmm-yyy, устанавливая некоторый атрибут в xslt и применяя тот же формат в коде синтаксического анализатора отчета, который написан на С#
В XSLT 1.0 нет поддержки регулярных выражений, поэтому ваши теги не имеют смысла. Во всяком случае, ваш вопрос i9s до сих пор не ясен.
Вы спрашиваете, как определить, находится ли входное значение в формате ДД-МММ-ГГГГ?
michael.hor257k - Да. Я хочу знать, как определить, что входное значение находится в формате DD-MMM-YYYY.
Вы также хотите проверить, действительна ли дата? т. е. «31 февраля 2019 года» имеет формат ДД-МММ-ГГГГ, но на самом деле не является действительной датой.





В XSLT 2.0 это довольно тривиально: matches(., '[0-9]{2}-[A-Z][a-z]{2}-[0-9]
{4}')
В 1.0 это значительно сложнее, и немного зависит от того, насколько точным вы хотите быть. Но вы можете приблизиться к translate(translate($input, 'ABC...abc...', 'AAAAAAAA....'), '0123456789', '9999999999') = '99-AAA-9999'), где «...» означает, что вы должны написать остальную часть алфавита.
В этом, где я должен передать входное значение? - translate(translate('ABC...abc...', 'AAAAAAAA....', ''), '0123456789', '9999999999') = '99-AAA-9999')
Я отредактировал ответ, чтобы использовать «$ input» в качестве входного значения.
Как я сказал в комментариях, в XSLT 1.0 нет поддержки регулярных выражений, поэтому это может быть довольно утомительно.
Рассмотрим следующий пример:
XML
<input>
<item>21-Jan-1987</item>
<item>921-Jan-1987</item>
<item>15-Jul-2009</item>
<item>15-Jux-2009</item>
<item>03-Dec-2014</item>
<item>03-Dec-999</item>
</input>
XSLT 1.0
<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:strip-space elements = "*"/>
<xsl:template match = "/input">
<output>
<xsl:for-each select = "item">
<item value = "{.}">
<xsl:variable name = "dd" select = "substring-before(., '-')" />
<xsl:variable name = "mmm" select = "substring-before(substring-after(., '-'), '-')" />
<xsl:variable name = "yyyy" select = "substring-after(substring-after(., '-'), '-')" />
<xsl:if test = "translate($dd, '123456789', '000000000') = '00' and translate($yyyy, '123456789', '000000000') = '0000' and ($mmm='Jan' or $mmm='Feb' or $mmm='Mar' or $mmm='Apr' or $mmm='May' or $mmm='Jun' or $mmm='Jul' or $mmm='Aug' or $mmm='Sep' or $mmm='Oct' or $mmm='Nov' or $mmm='Dec')">
<xsl:text>Is Date</xsl:text>
</xsl:if>
</item>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
Результат
<?xml version = "1.0" encoding = "UTF-8"?>
<output>
<item value = "21-Jan-1987">Is Date</item>
<item value = "921-Jan-1987"/>
<item value = "15-Jul-2009">Is Date</item>
<item value = "15-Jux-2009"/>
<item value = "03-Dec-2014">Is Date</item>
<item value = "03-Dec-999"/>
</output>
Обратите внимание, что это проверяет только соответствие ввода шаблону, а не правильность самой даты. Также имейте в виду, что XML чувствителен к регистру.
Добавлен:
Если вы предпочитаете, вы можете упростить тест до:
<xsl:if test = "translate(translate(translate(., '123456789', '000000000'), 'JFMASOND', '@@@@@@@@'), 'anebpryulgctov', '%%%%%%%%%%%%%%') = '00-@%%-0000'">
но тогда значение, подобное 15-Jpt-2009, будет передано как дата.
Этот подход работает для меня. Я использовал опцию contains для соответствия месяцам в нижнем и верхнем регистре. Спасибо.
Пожалуйста, покажите образец вашего ввода и желаемого результата. Если вы сможете перейти на XSLT 2.0/3.0, это сделает вашу жизнь намного проще.