Извлечение значения версии атрибута в файл SLD геосервера с помощью xmllint и xpath - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно извлечь версию файла SLD для GeoServer, который является языком разметки на основе XML. Версия является атрибутом элемента StyledLayerDescriptor.

Вот XML-файл:

$ cat my_geoserver_sld_file.sld
<?xml version="1.0" encoding="ISO-8859-1"?>
  <StyledLayerDescriptor version="1.0.0"
    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
    xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <NamedLayer>
      <Name>230_sld_shp_line__230_test_sld_shp_line</Name>
        <UserStyle>
        <Title>A green line style</Title>
        <FeatureTypeStyle>
          <Rule>
             <Title>green line</Title>
             <LineSymbolizer>
               <Stroke>
                 <CssParameter name="stroke">#00ff00</CssParameter>
               </Stroke>
             </LineSymbolizer>
          </Rule>
        </FeatureTypeStyle>
      </UserStyle>
    </NamedLayer>
  </StyledLayerDescriptor>

Я бы хотел установить: версия = "1.0.0"

сначала файл был открыт командой de "xmllint --shell", чтобы использовать xpath:

$ xmllint --shell my_geoserver_sld_file.sld
/ > xpath *
Object is a Node Set :
Set contains 1 nodes:
1  ELEMENT StyledLayerDescriptor
    default namespace href=http://www.opengis.net/sld
    namespace ogc href=http://www.opengis.net/ogc
    namespace xlink href=http://www.w3.org/1999/xlink
    namespace xsi href=http://www.w3.org/2001/XMLSchema-instanc...
    ATTRIBUTE version
      TEXT
        content=1.0.0
    ATTRIBUTE schemaLocation
      TEXT
        content=http://www.opengis.net/sld http://schema...

должно быть просто извлечь версию, но она не удалась ...

/ > cat //StyledLayerDescriptor/version/text()
/ >

Как установить версию в переменной bash?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

По предложению Дэниэля Халли, можно использовать local-name () для соответствия имени элемента StyledLayerDescriptor:

xmllint --xpath "string(/*[local-name()='StyledLayerDescriptor']/@version)" my_geoserver_sld_file.sld
0 голосов
/ 08 мая 2018

Ваш XPath не работает из-за пространства имен по умолчанию (http://www.opengis.net/sld) в вашем XML.

См. Этот ответ , где описаны некоторые варианты обработки пространств имен по умолчанию в xmllint.

Кроме того, поскольку атрибут, который вы пытаетесь выбрать, находится в корневом элементе, просто используйте /* в своем xpath ...

xmllint --xpath "/*/@version" my_geoserver_sld_file.sld

Это вернет version="1.0.0". Если вы просто хотите значение 1.0.0, используйте string() ...

xmllint --xpath "string(/*/@version)" my_geoserver_sld_file.sld
...