如何确定值格式为xslt中的dd-mmm-yyyy

时间:2019-07-18 11:14:36

标签: regex xslt xslt-1.0

我必须确定日期格式为dd-mmm-yyyy的输入值。如果可以找到将基于该属性设置一些属性的属性,则可以在C#报表处理类中进行格式化。

    <td>
 <xsl:if test="To write expression to match the value">
        <r>
        <xyz:value-of select="'Set Value'" />
        </r>
</xsl:if>
</td>

输入值为“ 2019年6月30日”。如果匹配,我要设置。 基本上,我在报告中有一组列。如果值与dd-mmm-yyy的Date格式匹配,则必须在报表中标识这些值,并在xslt中设置一些属性,并在用c#编写的报表解析器代码中应用相同的格式

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,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的值将作为日期传递。

答案 1 :(得分:0)

在XSLT 2.0中,这很简单:matches(., '[0-9]{2}-[A-Z][a-z]{2}-[0-9] {4}')

在1.0中,难度要大得多,这在一定程度上取决于您要达到的精度。但是您可能会与translate(translate('ABC...abc...', 'AAAAAAAA....', ''), '0123456789', '9999999999') = '99-AAA-9999')接近,其中的'...'表示您必须写出其余字母。