gpt4 book ai didi

xml - 在 xmlstarlet 上使用 xpath 检索 XML 元素的所有属性名称

转载 作者:数据小太阳 更新时间:2023-10-29 02:53:21 29 4
gpt4 key购买 nike

我可以看到如何检索所有属性值:
xml sel -t -v "//element/@*"

但我想获取所有属性名称
我可以通过 xml sel -t -v "name(//x:mem/@*[3])" 获取第 n 个名称,它返回第三个属性名称。
但是 xml sel -t -v "name(//x:mem/@*)" 不起作用(仅返回第一个属性名称)...

有没有办法获取所有属性名称?

最佳答案

使用 -t-m 定义模板匹配,然后使用 -v 应用另一个 XPath 表达式。

$ xml sel -T -t -m "//mem/@*" -v "name()" -n input.xml

应用于此输入 XML 时:

<root>
<mem yes1="1" yes2="2"/>
<other no="1" no2="2"/>
</root>

将打印:

yes1
yes2

那是“外壳上的短线”,但完全看不懂。因此,我仍然更喜欢 kjhughes 的 XSLT 解决方案。不要为了简洁而牺牲可理解的代码。

您可以编写一个从命令行获取输入参数的样式表,这样如果您想要检索不同元素的属性名称,就不必更改 XSLT 代码。


正如@npostavs 所建议的,在内部,xmlstarlet 仍然使用XSLT。您可以检查通过将 -T 替换为 -C 生成的 XSLT:

$ xml sel -C -t -m "//mem/@*" -v "name()" -n app.xml

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" version="1.0" extension-element-prefixes="exslt">
<xsl:output omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:for-each select="//mem/@*">
<xsl:call-template name="value-of-template">
<xsl:with-param name="select" select="name()"/>
</xsl:call-template>
<xsl:value-of select="'&#10;'"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="value-of-template">
<xsl:param name="select"/>
<xsl:value-of select="$select"/>
<xsl:for-each select="exslt:node-set($select)[position()&gt;1]">
<xsl:value-of select="'&#10;'"/>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

还有更多选项可供探索,请参阅 xmlstarlet documentation .

关于xml - 在 xmlstarlet 上使用 xpath 检索 XML 元素的所有属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28148411/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com