我有以下XML示例文件。
<root>
<ul id="nav">
<li id="id1">some</li>
<li id="id2"> unimportant
</li>
<li id="id3"> text.
</li>
</ul>
<ul id="tag">
<li id="id1">SOME</li>
<li id="id2"> MORE
</li>
<li id="id3"> TEXT.
</li>
</ul>
</root>
我想使用xmllint
提取<li>
下列出的所有<ul id="nav">
元素的所有属性值。
我可以用
xmllint --xpath '//ul[@id="nav"]/li/@id' sample.xml
将返回
id="id1" id="id2" id="id3"
但是,我想得到
id1 id2 id3
我试过
xmllint --xpath 'string(//ul[@id="nav"]/li/@id)' sample.xml
但这只返回第一个属性的值
id1
我可以在不使用awk,sed等其他工具的情况下提取所有值吗?它们可能由空格或换行符分隔,在我的情况下并不重要。
答案 0 :(得分:1)
如果您可以使用xmlstarlet,则可以使用-v
(--value-of
)命令行选项:
xmlstarlet sel -t -v "//ul[@id='nav']/li/@id" sample.xml
我认为你不能使用HTML作为sel
命令的输入,但我可能错了。
我知道您可以使用tr
(翻译)命令(使用--html
)。然后你可以使用XSLT ......
xmlstarlet tr --html sample.xsl sample.xml
XSLT (sample.xsl)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="//ul[@id='nav']/li/@id">
<xsl:value-of select="concat(.,'
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>