【问题标题】:How do I apply regex in xslt 2.0 with analyze-string component correctly如何在 xslt 2.0 中正确应用带有分析字符串组件的正则表达式
【发布时间】:2018-02-09 03:51:41
【问题描述】:

我有一个关于 xslt 2.0 转换和分析字符串组件的问题:

这是我迄今为止尝试过的:

<!-->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 块被执行,而不是 ma​​tching-substring 块。我还尝试使用 xsl when 元素和匹配工作,但这不是我想要的方式,而且我想使用 regex-group() 函数,因为它完全符合我的需求。

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

【问题讨论】:

  • 请发布一个最小但完整的 XML 输入示例来演示问题。

标签: xml xslt xslt-2.0


【解决方案1】:

既然您的问题已经得到解答,请考虑一种完全不同的方法,该方法利用 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

【讨论】:

    【解决方案2】:

    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}})$">
    

    【讨论】:

    • 感谢您的精彩解释!这正好解决了问题!
    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2022-01-25
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多