使用 XmlStarlet 根据子节点值搜索标签属性值

search tag attribute value based on child node value using XmlStarlet

我有一个 xml 文件,其结构如下所示:

        <role name="test" pattern=".*">
            <assignedSIDs>
                <sid>abc</sid>
                <sid>cde</sid>
                <sid>def</sid>
            </assignedSIDs>
        </role>

        <role name="test1" pattern=".*">
            <assignedSIDs>
                <sid>abc</sid>
                <sid>zxc</sid>
                <sid>vbn</sid>
            </assignedSIDs>
        </role>

        <role name="test2" pattern=".*">
            <assignedSIDs>
                <sid>abc</sid>
                <sid>hex</sid>
                <sid>oct</sid>
            </assignedSIDs>
        </role>

我想根据 sid 标签的值查找 role 标签名称属性。 例如:如果我搜索 abc,查询必须 return 测试,test1test2

我在下面提到了这个 link 并得到了一半的解决方案。

XMLStarlet Return attribute based on value (Reverse lookup)

我也参考了这个

http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html

但我没有找到任何支持我的要求的示例。

有什么我可以做的吗?

你可以使用的XPath表达式是//role[.//sid = 'abc' ]/@name,xmlstarlet的命令行是xmled.exe sel -t -v "//role[.//sid = 'abc']/@name" input.xml(我认为这取决于你的命令行shell你需要使用哪个引号字符包装 XPath 表达式)。

即使@martin-honnen 给出的 XPATH 是正确的,我也没有得到预期的输出。这是由于我的系统中安装了旧版本的 xmlstarlet 1.0.1。当我升级到 1.6.1 时,问题就解决了。
这是 link,@kjhughes 帮助我找到了解决方案