2014-05-15 29 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> 

如果源值相匹配的输入值的一个,你会使用匹配条目的输出值作为输出;否则源输入值将被传递到输出,如

请注意,您的架构不会提供必要的信息来实现此替换。