我有以下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新手,所以我很感激任何/所有的帮助! 谢谢!
答案 0 :(得分: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