xslt中如何判断值格式是dd-mmm-yyyy
How to determine the value format is dd-mmm-yyyy in xslt
我必须确定日期格式为 dd-mmm-yyyy 的输入值。如果我能找到将根据属性设置一些属性,我可以在 C# 报告处理中执行格式 class。
<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 中设置某些属性并在用 c#
编写的报告解析器代码中应用相同的格式
在 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')
,其中 '...' 意味着你必须写出字母表的其余部分。
正如我在评论中所说,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 是 case-sensititve.
已添加:
如果您愿意,可以将测试简化为:
<xsl:if test="translate(translate(translate(., '123456789', '000000000'), 'JFMASOND', '@@@@@@@@'), 'anebpryulgctov', '%%%%%%%%%%%%%%') = '00-@%%-0000'">
但是像 15-Jpt-2009
这样的值将作为日期传递。
我必须确定日期格式为 dd-mmm-yyyy 的输入值。如果我能找到将根据属性设置一些属性,我可以在 C# 报告处理中执行格式 class。
<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 中设置某些属性并在用 c#
编写的报告解析器代码中应用相同的格式在 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')
,其中 '...' 意味着你必须写出字母表的其余部分。
正如我在评论中所说,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 是 case-sensititve.
已添加:
如果您愿意,可以将测试简化为:
<xsl:if test="translate(translate(translate(., '123456789', '000000000'), 'JFMASOND', '@@@@@@@@'), 'anebpryulgctov', '%%%%%%%%%%%%%%') = '00-@%%-0000'">
但是像 15-Jpt-2009
这样的值将作为日期传递。