2012-09-12 52 views
-1

我對xsl和函數式編程相當陌生,所以我將不勝感激這個幫助:

我有一個模板可以轉換一些xml並提供輸出。問題在於類型的許多元素xs:日期,都在不同的上下文中,必須進行本地化。我使用這些xs:日期的子串的連接來產生一個本地化的日期模式字符串。

正如你所猜測的,這會導致很多複製粘貼「substring-this and substring-that」。我該如何編寫一個能夠自動將類型爲xs:date的所有元素轉換爲保存所有上下文感知轉換的本地化字符串的模板?

我的XSL是這樣的:XSLT - 如何將模板應用於該類型的每個節點?

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" encoding="utf-8"/> 
     <xsl:template match="/"> 
     ... 
     <input value="{substring(/select/a/date 9,2)}.{substring(/select/a/date, 6,2)}.{substring(/select/a/date 1,4)}"> 
     ... 
     <!-- assume that following examples are also with substrings --> 
     <div><xsl:value-of select="different-path/to_date"/></div> 
     ... 
     <table> 
     <tr><td><xsl:value-of select="path/to/another/date"/></td></tr> 
     </table> 
     <apply-templates/> 
     </xsl:template> 
     <xsl:template match="something else"> 
     <!-- more dates here --> 
     </xsl:template> 
</xsl:stylesheet> 

我希望我設法使我的問題明確=)

UPD:這裏是XML的例子:

<REQUEST> 
    <header> 
     <... /> 
     <ref> 
      <ref_date type="xs:date">1970-01-01</ref_date> 
     </ref> 
    </header> 

    <general> 
     <.../> 
     <info> 
      <.../> 
      <date type="xs:date">1970-01-01</date> 
      <ExpireDate type="xs:date">1970-01-01</ExpireDate> 
      <RealDate type="xs:date">1970-01-01</RealDate> 
      <templateDetails>template details</templateDetails> 
      <effectiveDate type="xs:date">1970-01-01</effectiveDate> 
     </info> 

     <party> 
      <.../> 
       <date type="xs:date">1970-01-01</date> 
     </party> 

     <!-- many other parts of such kind --> 
    </general> 

</REQUEST> 

由於對於輸出來說,有很多不同的選擇。最主要的是這些值必須設置爲不同的html對象的值,例如表格,輸入字段等。您可以在xsl列表中看到一個示例。

P.S.我使用的是xsl 1.0。

+1

這幾乎可以肯定是由利用一個模板在你的XSLT來實現匹配的屬性,但它確實有幫助,如果你表現出了(小)示例XML文檔,你的預期產出。謝謝! –

+0

添加了一個xml示例。 – svz

+0

請提供確切的想要的輸出。 –

回答

1

你可以做的就是添加一個模板,其中有一個@type屬性的元素匹配「的xs:日期」,和你在那裏

<xsl:template match="*[@type='xs:date']"> 
    <xsl:value-of select="translate(., '-', '/')" /> 
</xsl:template> 

串操作在這種情況下,我剛剛更換以斜槓爲例的連字符。

然後,而不是使用的xsl:價值的....

<div><xsl:value-of select="different-path/to_date"/></div> 

你可以使用XSL :應用模板

<div><xsl:apply-templates select="different-path/to_date"/></div> 

考慮這個XSLT作爲一個例子

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="*[@type='xs:date']"> 
     <xsl:copy> 
      <xsl:value-of select="translate(., '-', '/')" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

In在這種情況下,所有這些XSLT正在做的是按原樣複製XML文檔,但更改日期元素。

如果你想使用其他元素,或值的日期模板,你也可以把它命名模板,像這樣

<xsl:template match="*[@type='xs:date']" name="date"> 
    <xsl:param name="date" select="." /> 
    <xsl:value-of select="translate($date, '-', '/')" /> 
</xsl:template> 

這將讓你也多少這樣稱呼它的功能。例如,格式化數據,並添加你可以做以下屬性:如果你做了感知模式的XSLT 2.0轉換

<input> 
    <xsl:attribute name="value"> 
     <xsl:call-template name="date"> 
      <xsl:with-param name="date" select="/select/a/date" /> 
     </xsl:call-template> 
    </xsl:attribute> 
</input> 
+0

是的,這看起來像我需要的,謝謝。我會試一試。順便說一句,如何在這種情況下使用'':''?我是否必須使用''和xml轉義以確保''標籤被正確處理,或者有其他方法嗎? – svz

+0

我已經擴展了我的答案來解釋這一點。 –

+0

謝謝!希望我能+1兩次=) – svz

1

,你不會需要所有這些type='xs:date'屬性:它定義在作爲日期的模式就足夠了。然後,您可以用

<xsl:template match="attribute(*, xs:date)">

+0

不幸的是,這不取決於我決定。約束是使用xsl v1.0 – svz

相關問題