У меня есть XML файл, подобный этому:
sources. xml
<?xml version="1.0" encoding="UTF-8"?>
<sources>
<source>
<identity id="abc"/>
<somestuff/>
</source>
<source>
<identity id="def"/>
<someotherstuff/>
</source>
</sources>
Я хочу избавиться от тега identity
и передать его атрибут в родительский узел. Другими словами, мне нужно изменить мой входной файл на:
<?xml version="1.0" encoding="UTF-8"?>
<sources>
<source id="abc">
<somestuff/>
</source>
<source id="def">
<someotherstuff/>
</source>
</sources>
Я пытался:
xmlstarlet edit \
--insert "//source" --type attr --name "id" --value "identity/@id" \
--delete "//identity" \
sources.xml
, который не работает, потому что --value
понимает свой аргумент как постоянную строку.
Мой вопрос: возможно ли для xmlstarlet вычислить значение атрибута id
в виде выражения XPATH, как в операциях select
?
Edit nr. 1
Я нашел способ что-то сделать в этом направлении:
xmlstarlet edit \
--insert "//source" --type attr --name "id" --value "{PLACE HOLDER}" \
--update "//source/@id" --expr "../identity/@id" \
--delete "//identity" \
sources.xml
но я получаю пустые значения для атрибута id
:
<?xml version="1.0" encoding="UTF-8"?>
<sources>
<source id="">
<somestuff>Hello</somestuff>
</source>
<source id="">
<someotherstuff/>
</source>
</sources>
Что не так в выражении ../identity/@id
?