2015-02-12 2 views
1

Я хотел бы использовать xpath из xmllint для извлечения имени хоста и серийного номера.Получение нескольких значений с помощью xmllint

Вот XML

<hosts> 
<host name="blah001" serial="ABC001"> 
    <moreinfo /> 
</host> 
<host name="blah002" serial="ABC002"> 
    <moreinfo /> 
</host> 
.. 
</hosts> 

Я могу забрать все сериалы с именем хоста бла *:

/ > cat //hosts/host[starts-with(@name,"blah")]/@serial 
------- 
serial="ABC001" 
------- 
serial="ABC002" 

Но я также хочу, чтобы увидеть, имя хоста было что серийный. Это возможно?

+1

http://unix.stackexchange.com/questions/52711/xmllint-display-values-of-more-than-1-attributes-in-single-execution –

ответ

2

Возможно, достаточно просто выбрать все атрибуты элемента host?

$ xmllint example.xml --xpath "//hosts/host[starts-with(@name,"blah")]/@*" > out.txt 
$ cat out.txt 
    name="blah001" serial="ABC001" name="blah002" serial="ABC002" 

Если этого недостаточно - если выход должен быть структурирован определенным образом, я рекомендую вам написать простое преобразование XSLT или использовать XQuery.

EDIT

так что я буду следовать вашему предложению и использовать XSLT или XQuery

Хорошо, в случае, если вы решите для XSLT, таблицы стилей, которые должны были бы выглядеть так:

XSLT Таблицы стилей (1.0)

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" encoding="UTF-8" /> 

    <xsl:template match="host[starts-with(@name,'blah')]"> 
     <xsl:value-of select="concat('HOST: ',@name, ' SERIAL: ', @serial)"/> 
    </xsl:template> 
</xsl:transform> 

Выход

HOST: blah001 SERIAL: ABC001 
HOST: blah002 SERIAL: ABC002 
+0

Это дал бы мне все совпадения на одной строке, поэтому, я буду следовать вашему предложению и использовать xslt или xquery. –

+0

@BillT Хорошо, пожалуйста, также см. Мое редактирование, если вы решите использовать XSLT. –

Смежные вопросы