2010-08-18 22 views
2

這種格式我有一個XML結構:如何提取XSLT

<Date>Mon, 11 Aug 2009 13:15:10 GMT</Date> 

我想只提取15:10或「15」和「10」。 使用xslt做什麼最好的方法是什麼

+0

好問題(+1)。看到我的答案是另一種通用的解決方案,可以與週日和月份的任意長度的名稱一起使用。 :) – 2010-08-18 12:55:40

回答

3

如果日期包含一個冒號僅在時間字段時間總是在格式HH表示:MM:SS然後選擇第一個冒號後的固定長度字符串應該解決您的問題

未測試的XSLT單行

<xsl:variable name="time" select="substring(substring-after(Date, ':'), 1, 5)"/> 
+0

是的,這將工作。 +1 – 2010-08-18 12:47:35

2

請在下面嘗試;假定日期始終是相同的格式。

<xsl:variable name='datetime' select="Date"/> 

<xsl:variable name='time' select='substring($datetime, 17 , 5)' /> 
+0

這是不行的,如果我在空間更改月份名稱 – Wondering 2010-08-18 07:31:22

+0

的劃定: 的 Simmo 2010-08-18 07:35:21

+0

@Wondering:如果更改月份名稱打破了該模式,則表明您的格式不是一個好的。 – 2010-08-18 12:46:49

1

這裏是一個一般XSLT溶液,其將是有用的,可以在將含在該問題中指定的格式的日期的字符串,進一個XML結構化的日期:

這使用FXSL 1.x模板str-split-to-words用多個可能的分隔符執行標記。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common"> 

    <xsl:import href="strSplit-to-Words.xsl"/> 

    <xsl:output indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 

     <xsl:variable name="vwordNodes"> 
     <xsl:call-template name="str-split-to-words"> 
      <xsl:with-param name="pStr" select="/"/> 
      <xsl:with-param name="pDelimiters" select="' ,'"/> 
     </xsl:call-template> 
     </xsl:variable> 

     <xsl:variable name="vTokens" select="ext:node-set($vwordNodes)/*"/> 

     <xsl:variable name="vrtfDateTimeStruct"> 
      <date> 
      <week-day-name val="{$vTokens[1]}"/> 
      <day val="{$vTokens[2]}"/> 
      <month-name val="{$vTokens[3]}"/> 
      <year val="{$vTokens[4]}"/> 
      <time val="{$vTokens[5]}"/> 
      <zone val="{$vTokens[6]}"/> 
      </date> 
     </xsl:variable> 

     <xsl:value-of select= 
     "substring(ext:node-set($vrtfDateTimeStruct)/*/time/@val,1,5)"/> 
    </xsl:template> 
</xsl:stylesheet> 

當這種變換所提供的XML文檔應用:

<Date>Mon, 11 Aug 2009 13:15:10 GMT</Date> 

想要的結果產生

13:15 

請注意:字符串是完全轉換爲XML結構化的日期usi ng代碼片段:

 <xsl:variable name="vrtfDateTimeStruct"> 
      <date> 
      <week-day-name val="{$vTokens[1]}"/> 
      <day val="{$vTokens[2]}"/> 
      <month-name val="{$vTokens[3]}"/> 
      <year val="{$vTokens[4]}"/> 
      <time val="{$vTokens[5]}"/> 
      <zone val="{$vTokens[6]}"/> 
      </date> 
     </xsl:variable> 
+0

你可以解釋一下,它是如何工作的 – Wondering 2010-08-18 13:36:04

+0

@Wondering,@Ajjandro:我完全用XSLT替代瞭解決方案,它完全重構了DateTime結構。 – 2010-08-18 16:24:59

+0

+1美麗的答案。我認爲RTF應該具有比屬性值更好的文本節點值,所以'string($ vrtfDateTimeStruct)'可以重建標記字符串...... – 2010-08-18 16:49:16