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

Regex 如何确定xslt中的值格式为dd-mmm-yyy,regex,xslt,xslt-1.0,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> </

我必须确定日期格式为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的日期格式匹配,我必须在xslt中设置一些属性,并在xslt 2.0中用c编写的报告解析器代码中应用相同的格式,那么我必须识别报告中的值。这相当简单:匹配。,“[0-9]{2}-[A-Z][A-Z]{2}-[0-9] {4} "


在1.0中,这要困难得多,这取决于你想要的精确程度。但是您可以使用translatetranslate$input、'ABC…ABC…'、'AAAAAAAA…'、'0123456789'、'9999999'='99-AAA-9999',其中的“…”表示您必须写出字母表的其余部分。

正如我在评论中所说的,XSLT1.0中没有正则表达式支持,因此这可能会变得非常乏味

考虑以下示例:

XML

XSLT1.0

结果

注意,这只检查输入是否符合模式,而不是日期本身是否有效。还要记住,XML是区分大小写的

增加:

如果愿意,可以将测试简化为:

<xsl:if test="translate(translate(translate(., '123456789', '000000000'), 'JFMASOND', '@@@@@@@@'), 'anebpryulgctov', '%%%%%%%%%%%%%%') = '00-@%%-0000'">

但是,像15-Jpt-2009这样的值将作为日期传递。

请显示输入和所需输出的示例。如果您可以继续使用XSLT 2.0/3.0,那么您的生活将更加轻松。输入值为2019年6月30日。如果匹配,我想设置。基本上,我在报告中有一组列。如果值与dd-mmm-yyy的日期格式匹配,我必须在xslt中设置一些属性,并在用CTT编写的报告解析器代码中应用相同的格式,那么我必须识别报告中的值。xslt 1.0中不支持正则表达式,因此您的标记没有意义。无论如何,您的问题I9仍然不清楚。您是否在问如何确定输入值是否为DD-MMM-YYYY格式?michael.hor257k-是。我想知道如何确定输入值是DD-MMM-YYYY格式的。这种方法适合我。我使用了contains选项来匹配小写和大写月份。谢谢。在这里我必须传递输入值吗?-translatetranslate'ABC…ABC…','AAAAAAA…','0123456789','99999999'='99-AAA-9999'我已经编辑了答案,使用“$input”作为输入值。
<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>
<xsl:if test="translate(translate(translate(., '123456789', '000000000'), 'JFMASOND', '@@@@@@@@'), 'anebpryulgctov', '%%%%%%%%%%%%%%') = '00-@%%-0000'">