多态性

在这种情况下,多态性指的是属性具有不同形式的能力。根据源值的不同,它可以使用特定的结构、类型、作为xlink:href引用进行编码,或者根本不进行编码。为了实现这一点,我们重用了特性链接语法,并允许在linkelement标记中使用ocql函数。了解更多信息 特征链 ,如果您不熟悉语法。

数据类型多态性

您可以使用普通的特征链来获取要编码为特定类型的属性。例如::

<AttributeMapping>
    <targetAttribute>ex:someAttribute</targetAttribute>
    <sourceExpression>
        <OCQL>VALUE_ID</OCQL>
          <linkElement>NumericType</linkElement>
          <linkField>FEATURE_LINK</linkField>
    </sourceExpression>
</AttributeMapping>
<AttributeMapping>
    <targetAttribute>ex:someAttribute</targetAttribute>
    <sourceExpression>
          <OCQL>VALUE_ID</OCQL>
          <linkElement>gsml:CGI_TermValue</linkElement>
          <linkField>FEATURE_LINK</linkField>
    </sourceExpression>
</AttributeMapping>

注意:这里的numericType是一个映射名称,而gsml:cgi-termValue是一个targetElement。

在上面的示例中,如果外键与LinkField匹配,那么将使用numericType中的配置对ex:someattribute进行编码。如果外键与两个链接配置中的候选键匹配,则会对这两个实例进行编码。因此,这只适用于0对多关系。

函数可用于单个属性实例。参见 useful functions 获取常用函数的列表。在LinkElement中指定函数,并将其映射到第一个匹配的FeatureTypeMapping。例如::

<AttributeMapping>
    <targetAttribute>ex:someAttribute</targetAttribute>
    <sourceExpression>
          <OCQL>VALUE_ID</OCQL>
          <linkElement>
            Recode(CLASS_TEXT, 'numeric', 'NumericType', 'literal', 'gsml:CGI_TermValue')
        </linkElement>
          <linkField>FEATURE_LINK</linkField>
    </sourceExpression>
    <isMultiple>true</isMultiple>
</AttributeMapping>

上面的示例意味着,如果类的文本值是“numeric”,它将链接到“numeric type”featuretypemapping,值为链接类型的外键。它将要求所有潜在的匹配类型具有在LinkField中指定的公共属性。在本例中,linkfield是feature_link,这是一个仅用于特征链接的伪属性。如果链接到的FeatureTypeMapping与容器类型具有相同的SourceType,则可以省略LinkField和OCQL。这样可以避免不必要的额外查询,这会影响性能。例如:

容器类型的FeatureTypeMapping::

<FeatureTypeMapping>
    <sourceDataStore>PropertyFiles</sourceDataStore>
    <sourceType>PolymorphicFeature</sourceType>

NumericType的FeatureTypeMapping指向同一个表:

<FeatureTypeMapping>
    <mappingName>NumericType</mappingName>
    <sourceDataStore>PropertyFiles</sourceDataStore>
    <sourceType>PolymorphicFeature</sourceType>

gsml:cgi-termValue的特征类型映射也指向同一个表:

<FeatureTypeMapping>
    <sourceDataStore>PropertyFiles</sourceDataStore>
    <sourceType>PolymorphicFeature</sourceType>
    <targetElement>gsml:CGI_TermValue</targetElement>

在这种情况下,我们可以在多态属性映射中省略linkfield::

<AttributeMapping>
    <targetAttribute>ex:someAttribute</targetAttribute>
    <sourceExpression>
          <linkElement>
            Recode(CLASS_TEXT, 'numeric', 'NumericType', 'literal', 'gsml:CGI_TermValue')
        </linkElement>
    </sourceExpression>
    <isMultiple>true</isMultiple>
</AttributeMapping>

参考多态性

这是将属性设置为顶层的xlink:href引用进行编码时的情况。当场景中只有引用案例时,在客户机属性中设置一个函数将完成这项工作。例如。::

<AttributeMapping>
      <targetAttribute>ex:someAttribute</targetAttribute>
      <ClientProperty>
            <name>xlink:href</name>
            <value>if_then_else(isNull(NUMERIC_VALUE), 'urn:ogc:def:nil:OGC:1.0:missing', strConcat('#', NUMERIC_VALUE))</value>
    </ClientProperty>
</AttributeMapping>

上面的示例意味着,如果numeric_value为空,则属性应编码为::

<ex:someAttribute xlink:href="urn:ogc:def:nil:OGC:1.0:missing">

否则,它将被编码为:

<ex:someAttribute xlink:href="#123">
    where NUMERIC_VALUE = '123'

然而,当我们有完全结构化属性也是可能的情况时,这是不可能的。这个 toxlinkhref 函数可用于此方案。例如。::

<AttributeMapping>
    <targetAttribute>ex:someAttribute</targetAttribute>
    <sourceExpression>
          <linkElement>
            if_then_else(isNull(NUMERIC_VALUE), toXlinkHref('urn:ogc:def:nil:OGC:1.0:missing'),
              if_then_else(lessEqualThan(NUMERIC_VALUE, 1000), 'numeric_value', toXlinkHref('urn:ogc:def:nil:OGC:1.0:missing')))
        </linkElement>
    </sourceExpression>
</AttributeMapping>

上面的示例意味着,如果numeric_value为空,则输出将编码为::

<ex:someAttribute xlink:href="urn:ogc:def:nil:OGC:1.0:missing">

否则,如果numeric_value小于或等于1000,它将使用featureTypeMapping的属性和“numeric_value”MappingName进行编码。如果numeric_值大于1000,则将其编码为第一个方案。

有用的功能

如果那么其他功能

句法 ::

if_then_else(BOOLEAN_EXPRESSION, value, default value)
  • BOOLEAN_EXPRESSION :可以是布尔列值,也可以是布尔函数

  • 价值 :如果布尔表达式为真,则映射到的值

  • 默认值 :如果布尔表达式为假,则映射到的值

重编码功能

句法 ::

Recode(EXPRESSION, key1, value1, key2, value2,...)
  • EXPRESSION :要从中获取值的列名或其他函数

  • key-n
    • 要映射到值n的键表达式

    • 如果表达式的计算值与任何键都不匹配,则不会对该属性进行编码。

  • value-n :转换为MappingName或TargetElement的值表达式

莱塞科尔坦

如果属性表达式的计算结果小于或等于限制表达式,则返回true。

句法 ::

lessEqualThan(ATTRIBUTE_EXPRESSION, LIMIT_EXPRESSION)
  • ATTRIBUTE_EXPRESSION :正在计算的属性的表达式。

  • LIMIT_EXPRESSION :要与之比较的数值表达式。

雷斯坦

如果属性表达式的计算结果小于限制表达式,则返回true。

句法 ::

lessThan(ATTRIBUTE_EXPRESSION, LIMIT_EXPRESSION)
  • ATTRIBUTE_EXPRESSION :正在计算的属性的表达式。

  • LIMIT_EXPRESSION :要与之比较的数值表达式。

等于

比较两个表达式,如果相等则返回true。

句法 ::

equalTo(LHS_EXPRESSION, RHS_EXPRESSION)

是空的

如果表达式的计算结果为空,则返回一个布尔值,该值为真。

句法 ::

isNull(EXPRESSION)
  • EXPRESSION :要计算的表达式。

毒性链接

为引用多态性和特征链而编写的特殊函数,不能在链接元素之外使用。它推断属性应该编码为xlink:href。

句法 ::

toXlinkHref(XLINK_HREF_EXPRESSION)
  • XLINK_HREF_EXPRESSION
    • 可以是函数或文本

    • 如果是文字,必须用单引号包装

备注

  • 要使toxlinkHref函数正常工作,需要在命名空间中声明xlink uri。

其他功能

请参考 过滤函数引用 .

组合

您可以组合函数,但它可能会影响性能。例如。::

if_then_else(isNull(NUMERIC_VALUE), toXlinkHref('urn:ogc:def:nil:OGC:1.0:missing'),
    if_then_else(lessEqualThan(NUMERIC_VALUE, 1000), 'numeric_value', toXlinkHref('urn:ogc:def:nil:OGC:1.0:missing')))

备注

  • 在函数中将mappingname或targetElement指定为值时,请确保它们用单引号括起来。

  • 有些函数没有空检查,遇到空时会失败。

  • 解决方法是,如果已知数据集中存在空值,则使用isNull()函数包装表达式。

空值或缺少值

要跳过特定情况下的属性,可以使用expression.nil作为“if-then-else”或“not include the key-in”中的值。 Recode function . 例如。::

if_then_else(isNull(VALUE), Expression.NIL, 'gsml:CGI_TermValue')
    means the attribute would not be encoded if VALUE is null.

Recode(VALUE, 'term_value', 'gsml:CGI_TermValue')
    means the attribute would not be encoded if VALUE is anything but 'term_value'.

要将属性编码为xlink:href,表示顶层缺少的值,请参见 Referential Polymorphism .

任何类型

将xs:anyType作为属性类型本身可以推断它是多态的,因为它们可以被编码为任何类型。

如果类型是预先确定的并且总是相同的,我们可能需要指定 TargetAttributeNode(可选) . 例如。::

<AttributeMapping>
      <targetAttribute>om:result</targetAttribute>
      <targetAttributeNode>gml:MeasureType<targetAttributeNode>
      <sourceExpression>
          <OCQL>TOPAGE</OCQL>
      </sourceExpression>
      <ClientProperty>
          <name>xsi:type</name>
          <value>'gml:MeasureType'</value>
      </ClientProperty>
      <ClientProperty>
          <name>uom</name>
          <value>'http://www.opengis.net/def/uom/UCUM/0/Ma'</value>
      </ClientProperty>
</AttributeMapping>

如果强制转换类型很复杂,这不是一个要求,因为应用程序模式能够从targettribute中的xpath自动确定类型。例如,在本例中 om:result 自动专业化为mappedFeatureType::

<AttributeMapping>
      <targetAttribute>om:result/gsml:MappedFeature/gml:name</targetAttribute>
      <sourceExpression>
          <OCQL>NAME</OCQL>
      </sourceExpression>
</AttributeMapping>

或者,我们可以使用特征链。对于上面的同一个示例,映射为:

<AttributeMapping>
      <targetAttribute>om:result</targetAttribute>
      <sourceExpression>
            <OCQL>LEX_D</OCQL>
            <linkElement>gsml:MappedFeature</linkElement>
            <linkField>gml:name</linkField>
      </sourceExpression>
</AttributeMapping>

如果类型是有条件的,则此类属性的映射样式与任何其他多态属性相同。例如。::

<AttributeMapping>
      <targetAttribute>om:result</targetAttribute>
      <sourceExpression>
            <linkElement>
               Recode(NAME, Expression.Nil, toXlinkHref('urn:ogc:def:nil:OGC::missing'),'numeric',
               toXlinkHref(strConcat('urn:numeric-value::', NUMERIC_VALUE)), 'literal', 'TermValue2')
            </linkElement>
      </sourceExpression>
</AttributeMapping>

过滤器

只要用户知道他们想要过滤什么,过滤器就应该像往常一样工作。例如,当属性可以编码为gsml:cgi-termvalue或gsml:cgi-numericvalue时,用户可以运行属性名为以下值的筛选器:

  • 例如:someattribute/gsml:cgi-termvalue/gsml:value返回编码为gsml:cgi-termvalue的匹配属性并满足过滤器。

  • 同样,例如:someattribute/gsml:cgi_numericvalue/gsml:principalvalue应返回匹配的gsml:cgi_numericvalue属性。

另一个限制是过滤指向文档外部实例的xlink:href属性的属性。

Previous: 特征链