XMLStarlet — для каждого элемента ‹name›

У меня есть следующий XML.

<application>
<name>Activity Monitor.app</name>
<path>/Applications/Utilities/Activity Monitor.app</path>
<version>10.8.0< /version></application>
<application>
<name>Adobe Flash Player Install Manager.app</name>
<path>/Applications/Utilities/Adobe Flash Player Install Manager.app</path>
<version>11.3.300.268</version></application>

Используя XMLStarlet, я хотел бы получить следующий результат:

<package name="Activity Monitor.app">
<attribute name="Path">/Applications/Utilities/Activity Monitor.app</attribute>
<attribute name="Ver">10.8.0</attribute >
<package name="Adobe Flash Player Install Manager.app">
<attribute name="Path">/Applications/Utilities/Adobe Flash Player Install Manager.app</attribute>
<attribute name="Ver">11.3.300.268</attribute>

Я пробовал команду:

xml sel -t  -v "computer/software/applications/application/path" -v "computer/software/applications/application/name" -v computer/software/applications/application/version

но это просто список всех приложений, затем всех путей, а затем всей версии. Я новичок в XMLStarlet, поэтому буду признателен за любую помощь! Спасибо!


person user1582375    schedule 20.08.2012    source источник
comment
Я ответил на этот вопрос на форуме XMLStarlet.   -  person npostavs    schedule 21.08.2012


Ответы (1)


Я боюсь, что самый простой способ получить то, что вы хотите, — это написать преобразование xsl, подобное этому:

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

   <xsl:template match="application">
     <package>
       <xsl:attribute name="name">
         <xsl:value-of select="name"/>
       </xsl:attribute>
       <xsl:apply-templates/>
     </package>
   </xsl:template>

   <xsl:template match="path|version">
     <attribute>
       <xsl:attribute name="name">
         <xsl:value-of select="name()"/>
       </xsl:attribute>
       <xsl:value-of select="text()"/>
     </attribute>
   </xsl:template>

   <xsl:template match="text()"/>

</xsl:stylesheet>

Затем вы можете использовать xmlstarlet для преобразования:

xml tr thetransformation.xsl source.xml

Я всегда находил этот учебник очень полезным для подобных вещей: http://zvon.org/xxl/XSLTutorial/Output/contents.html#id8

person pbrc    schedule 20.08.2012