2014-05-15 47 views
0

我試圖將時區值從一個系統轉換爲另一個值以推送到另一個系統。XSLT根據枚舉檢查值或默認爲別的

所有的好我希望他們有使用州名而不是城市名稱,但沒關係,這是一個整合,不能在兩個系統中相互匹配更改。

我正在使用XSLT將1個xml文檔轉換爲另一個來執行此操作。

系統中的時區字符串下列之一:

Australia/Adelaide 
Australia/Brisbane 
Australia/Canberra 
Australia/Darwin 
Australia/Hobart 
Australia/Melbourne 
Australia/Perth 
Australia/Sydney 

目標系統中的時區設置爲按照以下:

Australia/Adelaide 
Australia/Brisbane 
Australia/Canberra,Melbourne,Sydney 
Australia/Darwin 
Australia/Hobart 
Australia/Perth 

我知道我可以只使用一個<xsl:choose>和使用<xs:when>等來確定每個字符串,但想了解如何比較從源代碼來的反對枚舉源類型,如果它存在使用它,如果它不存在,則使用默認值。這可能嗎。

我在XSLT枚舉每個目標系統定義爲我們需要的:提前

<xs:simpleType name="timeZoneType"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Australia/Canberra,Melbourne,Sydney" /> 
     <xs:enumeration value="Australia/Adelaide" /> 
     <xs:enumeration value="Australia/Brisbane" /> 
     <xs:enumeration value="Australia/Darwin" /> 
     <xs:enumeration value="Australia/Hobart" /> 
     <xs:enumeration value="Australia/Perth" /> 
    </xs:restriction> 
</xs:simpleType> 

乾杯任何幫助

+0

請註明XSLT 1.0或2.0。 –

+0

順便說一句:「*我希望他們有使用過的州名稱而不是城市名稱*」你應該看看http://en.wikipedia.org/wiki/Zoneinfo和http://en.wikipedia.org/wiki/List_of_tz_database_time_zones –

+0

嗨邁克爾,此刻使用xslt 1。 – Mark

回答

1

如果可以用一個模式感知XSLT 2.0處理器你可以做

<xsl:if test="$in castable as timeZoneType"> 

如果你不能,那麼你就必須手工工藝吧。您當然可以通過XSLT轉換處理您的模式文檔來生成XSLT代碼。

+0

感謝邁克爾通過apache駱駝使用這個,並且如果我不必使用camel-saxon,我不想使用它。但是,這有助於學習,這是問題的主要觀點,再次感謝 – Mark

+0

我不太確定這將如何工作。 「澳大利亞/堪培拉」的來源值將不能通過上述測試;這如何導致選擇「澳大利亞/堪培拉,墨爾本,悉尼」作爲重置價值? –

+0

它完成了作業的第一部分,「如果它存在(在列表中)然後使用它」。你可以把另一部分「如果它不存在」放在邏輯的另一個分支中。 –

1

想學習如何比較什麼是從源代碼來反對 枚舉源類型,如果存在使用它,如果它不存在 它然後使用一個默認值。

在XSLT 1.0(至少),相信這將是最好使用外部查找表以XML格式,例如:

<lookup> 
    <entry> 
     <input>Australia/Canberra</input> 
     <input>Australia/Melbourne</input> 
     <input>Australia/Sydney</input> 
     <output>Australia/Canberra,Melbourne,Sydney</output> 
    </entry> 
</lookup> 

如果源值相匹配的輸入值的一個,你會使用匹配條目的輸出值作爲輸出;否則源輸入值將被傳遞到輸出,如

請注意,您的架構不會提供必要的信息來實現此替換。