在`xml2`中使用断行和缩进格式化sld文件(xml)

问题描述 投票:0回答:1

我正在以编程方式为地理服务器编写大量 SDL 文件,这些文件的底层是 XML 文件。我正在使用 {xml2},虽然我在一个小表示中获得了正确的格式(每个标签在一行中并带有缩进),但这在我的完整示例中不再起作用。

我认为 geoserver 不关心换行符,但服务的管理员坚持认为,如果缩进不正确,SLD 文件将无法工作。

如何强制输出文件将一个标签放置在具有正确缩进的一行中?

格式正确的小代表:

library(xml2)

x <- read_xml("<parent></parent>")
xml_add_child(x, "child", type = "child")
child <- xml_find_first(x, ".//child")

for (i in 1:5) {
  xml_add_child(child, "small_child",
                label = i,
                .where = i)
}

x
#> {xml_document}
#> <parent>
#> [1] <child type="child">\n  <small_child label="1"/>\n  <small_child label="2 ...

write_xml(x, "small_reprex.sld")

创建于 2024-04-17,使用 reprex v2.1.0

具有正确缩进的输出文件:

<?xml version="1.0" encoding="UTF-8"?>
<parent>
  <child type="child">
    <small_child label="1"/>
    <small_child label="2"/>
    <small_child label="3"/>
    <small_child label="4"/>
    <small_child label="5"/>
  </child>
</parent>

不缩进标签的大型表示:

library(xml2)

xml_file <- read_xml('<?xml version="1.0" encoding="UTF-8"?>
<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
  <sld:NamedLayer>
    <sld:Name>SLD template for qualitative rasters</sld:Name>
    <sld:UserStyle>
      <sld:Name>SLD template for qualitative rasters</sld:Name>
      <sld:FeatureTypeStyle>
        <sld:Name>name</sld:Name>      
        <sld:Rule>
                <sld:RasterSymbolizer>
                </sld:RasterSymbolizer>
        </sld:Rule>
      </sld:FeatureTypeStyle>
    </sld:UserStyle>
  </sld:NamedLayer>
</sld:StyledLayerDescriptor>')

namedlayer <- xml_find_first(xml_file, ".//sld:NamedLayer")
namelayer <- xml_find_first(namedlayer, ".//sld:Name")
xml_text(namelayer) <- "Name changed"

userstyle <- xml_find_first(namedlayer, ".//sld:UserStyle")
namelayer <- xml_find_first(userstyle, ".//sld:Name")
xml_text(namelayer) <- "Name changed"

symb <- xml_find_first(xml_file, ".//sld:RasterSymbolizer")
xml_add_child(symb, "sld:ColorMap", type = "values", .where = 1)

colormap <- xml_find_first(xml_file, ".//sld:ColorMap")

labels <- letters[1:5]
colors <- viridis::turbo(5)

for (i in seq_along(labels)) {
  xml_add_child(colormap, "sld:ColorMapEntry",
                color = colors[[i]],
                quantity = i,
                label = labels[[i]],
                .where = i)
}

write_xml(xml_file, "reprex.sld", format = c("format", "as_xml"))

创建于 2024-04-17,使用 reprex v2.1.0

这里的输出文件将所有颜色映射条目放在一行中:

<?xml version="1.0" encoding="UTF-8"?>
<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
  <sld:NamedLayer>
    <sld:Name>Name changed</sld:Name>
    <sld:UserStyle>
      <sld:Name>Name changed</sld:Name>
      <sld:FeatureTypeStyle>
        <sld:Name>name</sld:Name>
        <sld:Rule>
          <sld:RasterSymbolizer>
                <sld:ColorMap type="values"><sld:ColorMapEntry color="#30123BFF" quantity="1" label="a"/><sld:ColorMapEntry color="#28BBECFF" quantity="2" label="b"/><sld:ColorMapEntry color="#A2FC3CFF" quantity="3" label="c"/><sld:ColorMapEntry color="#FB8022FF" quantity="4" label="d"/><sld:ColorMapEntry color="#7A0403FF" quantity="5" label="e"/></sld:ColorMap></sld:RasterSymbolizer>
        </sld:Rule>
      </sld:FeatureTypeStyle>
    </sld:UserStyle>
  </sld:NamedLayer>
</sld:StyledLayerDescriptor>
r xml xml2 sld
1个回答
0
投票

这是一个通用 XSLT,它将缩进任何格式良好的 XML 文件。

您只需要学习如何用您的编程语言执行 XSLT。

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output  method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/>

   <xsl:strip-space elements="*"/>

   <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.