2017-01-03 7 views
1

У меня есть SVG, который содержит следующие элементы (урезана):XMLStarlet: выберите атрибут, если ребенок существует

<svg 
    xmlns="http://www.w3.org/2000/svg" 
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"> 
    <g 
    inkscape:label="base" 
    inkscape:groupmode="layer" 
    id="layer1" 
    transform="translate(0,-600)"> 
    <image 
     sodipodi:absref="/Untitled.png" 
     xlink:href="/Untitled.png" 
     width="800" 
     height="500" 
     preserveAspectRatio="none" 
     id="image5168" 
     x="3.67" 
     y="596" /> 
    </g> 
    <g 
    inkscape:groupmode="layer" 
    id="layer30" 
    inkscape:label="triangle"> 
    <path 
     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" 
     d="M 273,340 290,127 563,307 Z" 
     id="path5174" 
     inkscape:connector-curvature="0" /> 
    </g> 
</svg> 

Complete XML

Когда я запрашиваю с:

xmlstarlet sel -t -v "//_:svg/_:g/@inkscape:label" drawing.svg

Я получаю:

base 
triangle 

Я копал через условные обозначения, но я не могу найти способ выбрать ginkscape:label, только если он содержит узел path [или иначе, если он не содержит узел image].

ответ

2

Чтобы получить только g, что имеет ребенка path, вы можете просто добавить path в предикате для g:

//_:svg/_:g[_:path]/@inkscape:label 
+0

Ой спасибо! Это работает отлично. – carlbently