Xml XSLT根据枚举检查值,或默认为其他值

Xml XSLT根据枚举检查值,或默认为其他值,xml,xslt,Xml,Xslt,我试图将一个时区值从一个系统转换为另一个要推送到另一个系统的不同值 一切都好,我希望他们使用州名而不是城市名,但没关系,这是一个整合,不能在两个系统中改变,只是相互匹配 我使用XSLT将一个xml文档转换为另一个xml文档来实现这一点 在源系统中,时区字符串为以下之一: Australia/Adelaide Australia/Brisbane Australia/Canberra Australia/Darwin Australia/Hobart Australia/Melbourne Aus

我试图将一个时区值从一个系统转换为另一个要推送到另一个系统的不同值

一切都好,我希望他们使用州名而不是城市名,但没关系,这是一个整合,不能在两个系统中改变,只是相互匹配

我使用XSLT将一个xml文档转换为另一个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
在目标系统中,时区设置如下:

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
我知道我可以使用
等来确定每个字符串,但我想学习如何将来自源代码的内容与枚举源类型进行比较,如果存在,则使用它,如果不存在,则使用默认值。这可能吗

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>


如果您可以使用支持模式的XSLT 2.0处理器,请提前为您提供帮助

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

如果你不能,那你就得手工制作了。当然,您可以通过XSLT转换处理模式文档来生成XSLT代码

想学习如何将来自源代码的内容与 枚举源类型,如果存在,请使用它,如果不存在 然后使用默认值

在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>

澳大利亚/堪培拉
澳大利亚/墨尔本
澳大利亚/悉尼
澳大利亚/堪培拉、墨尔本、悉尼
如果源值与其中一个输入值匹配,则将使用匹配项的输出值作为输出;否则,源输入值将按原样传递到输出


请注意,您的模式没有提供实现此替换所需的信息。

请说明XSLT 1.0或2.0。顺便说一句:“我希望他们使用的是州名而不是城市名”您应该看看,Michael,您好,现在使用XSLT 1。“现在使用XSLT 1”那么您将无法使用模式。我不知道你的枚举在这方面会有什么帮助。谢谢Michael,我通过ApacheCamel使用它,如果不需要的话,我不想使用camel-saxon。但这有助于学习,这是问题的重点,我不太确定这将如何工作。“澳大利亚/堪培拉”的源值将无法通过上述测试;这是如何导致选择“澳大利亚/堪培拉、墨尔本、悉尼”作为重置价值的?它完成了工作的第一部分,“如果它存在(在列表中),然后使用它”。你可以把另一部分“如果它不存在”放在逻辑的另一个分支中。干杯。根据M.Kay响应,如果它在枚举列表中,它将执行第一部分。您是对的,它在XSLT1.0中不起作用,但在2.0中起作用,所以我不能在我所做的事情中使用它。当我再次遇到它时,它会存储在内存库中:)