¿Se pueden reutilizar fragmentos de XML (en algún tipo de variables / referencias)?
-
22-07-2019 - |
Pregunta
Estoy usando SLD para diseñar la salida de mi geoservidor. Tengo dos tipos de objetos para mostrar. Cada tipo tiene iconos diferentes, pero la descripción del texto se genera a partir de la misma información (campo de texto en la base de datos). No puedo usar object_type como nombre de imagen porque no puedes usar variable en el nombre de la imagen (o no sé cómo hacerlo ...). Entonces tengo SLD como (sin partes sin importancia):
<StyledLayerDescriptor>
<NamedLayer>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<Filter>
<PropertyIsEqualTo>
<PropertyName>object_type</PropertyName>
<Literal>1</Literal>
</PropertyIsEqualTo>
</Filter>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/1.png" />
<Format>image/png</Format>
</ExternalGraphic>
<Size>16</Size>
<Opacity>1</Opacity>
</Graphic>
</PointSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Times New Roman</CssParameter>
<CssParameter name="font-style">Normal</CssParameter>
<CssParameter name="font-size">12</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#110011</CssParameter>
<CssParameter name="fill-opacity">1</CssParameter>
</Fill>
<Halo />
</TextSymbolizer>
</Rule>
<Rule>
<Filter>
<PropertyIsEqualTo>
<PropertyName>object_type</PropertyName>
<Literal>2</Literal>
</PropertyIsEqualTo>
</Filter>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/2.png" />
<Format>image/png</Format>
</ExternalGraphic>
<Size>16</Size>
<Opacity>1</Opacity>
</Graphic>
</PointSymbolizer>
<TextSymbolizer>
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Times New Roman</CssParameter>
<CssParameter name="font-style">Normal</CssParameter>
<CssParameter name="font-size">12</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#110011</CssParameter>
<CssParameter name="fill-opacity">1</CssParameter>
</Fill>
<Halo />
</TextSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
Y lo que me encantaría hacer sería escribir TextSymbolizer una vez y usarlo en dos o más lugares ... No he oído hablar de algo así en XML, pero ¿quizás sí? :-)
Una solución que se me ocurre es escribir un generador muy simple (xml.erb?: P) y dejar que genere XML ...
Solución
GeoServer " Dynamic Symbolizer " La extensión a SLD le permite utilizar las propiedades de la base de datos como todo o parte de las URL de los iconos. Incluso puede realizar cálculos y funciones de filtro de llamadas si lo desea (usan CQL incrustado en la URL.
Aquí hay una publicación de blog sobre la función: http: / /blog.geoserver.org/2008/12/08/dynamic-symbolizers-part-1/
Otros consejos
¿Intentó definir un Esquema XML u opcionalmente un XML DTD para su XML, y luego usando identificadores de elementos http://www.w3.org/TR/xmlschema-0/#schemaConstraintsVsXML1 , algo así :
<StyledLayerDescriptor>
<NamedLayer>
<CommonStyles>
<TextSymbolizer id="name_times_normal_12">
<Label>
<ogc:PropertyName>name</ogc:PropertyName>
</Label>
<Font>
<CssParameter name="font-family">Times New Roman</CssParameter>
<CssParameter name="font-style">Normal</CssParameter>
<CssParameter name="font-size">12</CssParameter>
</Font>
<Fill>
<CssParameter name="fill">#110011</CssParameter>
<CssParameter name="fill-opacity">1</CssParameter>
</Fill>
<Halo />
</TextSymbolizer>
</CommonStyles>
<UserStyle>
<FeatureTypeStyle>
<Rule>
<Filter>
<PropertyIsEqualTo>
<PropertyName>object_type</PropertyName>
<Literal>1</Literal>
</PropertyIsEqualTo>
</Filter>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/1.png" />
<Format>image/png</Format>
</ExternalGraphic>
<Size>16</Size>
<Opacity>1</Opacity>
</Graphic>
</PointSymbolizer>
<TextSymbolizer ref="#name_times_normal_12" />
</Rule>
<Rule>
<Filter>
<PropertyIsEqualTo>
<PropertyName>object_type</PropertyName>
<Literal>2</Literal>
</PropertyIsEqualTo>
</Filter>
<PointSymbolizer>
<Graphic>
<ExternalGraphic>
<OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/images/2.png" />
<Format>image/png</Format>
</ExternalGraphic>
<Size>16</Size>
<Opacity>1</Opacity>
</Graphic>
</PointSymbolizer>
<TextSymbolizer ref="#name_times_normal_12" />
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
XML incluye? http://www.xml.com/pub/a/ 2002/07/31 / xinclude.html