从 XML 获取所有属性值

Get all attribute values from XML

我有以下 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 来提取 <ul id="nav">.

下列出的所有 <li> 元素的所有属性值

我可以用

xmllint --xpath '//ul[@id="nav"]/li/@id' sample.xml

这将 return

id="id1" id="id2" id="id3"

不过,我想得到

id1 id2 id3

我试过了

xmllint --xpath 'string(//ul[@id="nav"]/li/@id)' sample.xml

但这只是return第一个属性的值

id1

我可以在不求助于 awk、sed 等其他工具的情况下提取所有值吗?它们可能由 space 或换行符分隔,这对我来说并不重要。

如果可以使用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(.,'&#xA;')"/>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>