我有一个关于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()
函数,因为它完全符合我的需要。
我找不到我在这里可能做的错误。提前谢谢!
答案 0 :(得分:4)
现在您的问题已得到解答,请考虑采用完全不同的方法,利用XSLT 2.0原生能力:
不需要正则表达式。
<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>
答案 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}})$">