2017-08-31 59 views
0

我有一个关于XSLT 2.0转换和分析串组成的一个问题:如何在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})$表达式提取两组。第一组包含日期,第二组包含时间,我想像样式表中那样添加它们。

现在发生的事情是,只有不匹配的子串块被执行,而不是匹配子串块。我也试过用xsl when元素和那里的匹配作品,但它不是我想要做的方式,而且我想使用regex-group()函数,因为它完全符合我的需求。

我找不到我可能在这里完成的错误。先谢谢你!

+1

请张贴最小但完整的XML输入样本来演示该问题。 –

回答

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

谢谢你的好解释!这确实解决了问题! – M4rk0444

3

现在你问题已经解决,可以考虑一个完全不同的方法,采用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> 

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