如何正确地使用analyze-string组件在xslt 2.0中应用正则表达式

时间:2017-08-31 08:51:40

标签: xml xslt xslt-2.0

我有一个关于xslt 2.0转换和analyze-string组件的问题:

这是我到目前为止所尝试的:

<!-->Template for properties<-->
<xsl:template match="UserValue">

    <xsl:variable name="TITLE" select="./@title"/>
    <xsl:variable name="VALUE" select="./@value"/>

    <xsl:analyze-string select="$VALUE" regex="^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})$">

        <xsl:matching-substring>
            <Property>  
                <Title><xsl:value-of select="$TITLE"/></Title>
                <Value>Date:<xsl:value-of select="regex-group(1)"/>Time:<xsl:value-of select="regex-group(2)"/></Value>
            </Property>
        </xsl:matching-substring>

        <xsl:non-matching-substring>
            <!-->Set title and value property<-->
            <Property>
                <Title><xsl:value-of select="$TITLE"/></Title>
                <Value><xsl:value-of select="$VALUE"/></Value>
            </Property>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

有以下格式的日期时间字符串:YYYY-MM-DDTHH:MM:SS

我使用 ^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})$ 表达式来提取两个组。第一组有日期,第二组有时间,我想添加它们就像它在样式表中一样。

现在发生的是,只执行了 non-matching-substring 块而不是 matching-substring 块。我也尝试使用xsl when元素和匹配工作,但它不是我想要的方式,我也想使用regex-group()函数,因为它完全符合我的需要。

我找不到我在这里可能做的错误。提前谢谢!

2 个答案:

答案 0 :(得分:4)

现在您的问题已得到解答,请考虑采用完全不同的方法,利用XSLT 2.0原生能力:

  • 识别代表dateTime的字符串;和
  • 将日期时间转换为日期和/或时间。

不需要正则表达式。

<xsl:template match="UserValue">
    <Property>  
        <Title>
            <xsl:value-of select="@title"/>
        </Title>
        <Value>
            <xsl:choose>
                <xsl:when test="@value castable as xs:dateTime">
                    <xsl:variable name="dt" select="xs:dateTime(@value)" /> 
                    <xsl:text>Date:</xsl:text>  
                    <xsl:value-of select="xs:date($dt)" />
                    <xsl:text>Time:</xsl:text>  
                    <xsl:value-of select="xs:time($dt)" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="@value"/>
                </xsl:otherwise>
            </xsl:choose>
        </Value>
    </Property>
</xsl:template>

演示:http://xsltransform.net/a9Gixn

答案 1 :(得分:3)

select中使用花括号代表Attribute Value Templates,这意味着花括号内的表达式将被执行以获取值,而不是按字面输出。所以,实际上你的正则表达式就好像是这样......

^(\d4-\d2-\d2)T(\d2:\d2:\d2)$

要防止使用属性值模板,您必须使用双花括号

<xsl:analyze-string select="$VALUE" regex="^(\d{{4}}-\d{{2}}-\d{{2}})T(\d{{2}}:\d{{2}}:\d{{2}})$">