2017-08-31 54 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