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

мне нужно извлечь версию файла 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>

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

сначала файл был открыт с помощью команды «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?


person MaxiReglisse    schedule 08.05.2018    source источник


Ответы (2)


Ваш 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
person Daniel Haley    schedule 08.05.2018
comment
Спасибо ! Обратите внимание, что string() объясняется здесь - person MaxiReglisse; 09.05.2018

как предложил Daniel Halley, можно использовать local-name() для соответствия имени элемента StyledLayerDescriptor:

xmllint --xpath "string(/*[local-name()='StyledLayerDescriptor']/@version)" my_geoserver_sld_file.sld
person MaxiReglisse    schedule 14.05.2018