首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >xmlstarlet匹配/解析按属性而不是元素

xmlstarlet匹配/解析按属性而不是元素
EN

Stack Overflow用户
提问于 2021-11-17 05:00:59
回答 1查看 78关注 0票数 0

我有一个复杂的结构化XML文件,我试图使用xmlstartlet解析一些值。我认为问题在于,逻辑对象是由元素属性而不是实际元素名称标识的。

本例中简化的文件test.xml如下所示:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<configDump>
  <cluster top-level-assembly="XYZ12312312312">
  </cluster>
  <views>
    <view status="ok" name="ABC">
      <viewInitiators>
        <viewInitiator id="ABCi1"></viewInitiator>
        <viewInitiator id="ABCi2"></viewInitiator>
      </viewInitiators>
      <viewPorts>
        <viewPort id="ABCp1"></viewPort>
        <viewPort id="ABCp2"></viewPort>
      </viewPorts>
      <viewVolumes>
        <viewVolume lun="1" id="ABCv1"></viewVolume>
        <viewVolume lun="2" id="ABCv2"></viewVolume>
      </viewVolumes>
    </view>
    <view status="ok" name="DEF">
      <viewInitiators>
        <viewInitiator id="DEFi1"></viewInitiator>
        <viewInitiator id="DEFi2"></viewInitiator>
      </viewInitiators>
      <viewPorts>
        <viewPort id="DEFp1"></viewPort>
        <viewPort id="DEFp2"></viewPort>
      </viewPorts>
      <viewVolumes>
        <viewVolume lun="1" id="DEFv1"></viewVolume>
        <viewVolume lun="2" id="DEFv2"></viewVolume>
      </viewVolumes>
    </view>
  </views>
</configDump>

我试图用如下所示的字段生成输出:

代码语言:javascript
运行
复制
<top-level-assembly>-<view-name>,<viewInitiator-ID>

当我运行以下命令时:

代码语言:javascript
运行
复制
xmlstarlet sel -t \
                -m //cluster \
                        --var sn=@top-level-assembly \
                -m //views/view \
                        --var view=@name \
                -m //views/view/viewInitiators/viewInitiator \
                        -v 'concat($sn,"-",$view,",",@id)' -n test.xml

我得到以下输出:

代码语言:javascript
运行
复制
XYZ12312312312-ABC,ABCi1
XYZ12312312312-ABC,ABCi2
XYZ12312312312-ABC,DEFi1
XYZ12312312312-ABC,DEFi2
XYZ12312312312-DEF,ABCi1
XYZ12312312312-DEF,ABCi2
XYZ12312312312-DEF,DEFi1
XYZ12312312312-DEF,DEFi2

正如您所看到的,我将在每个“视图”下获取所有“启动器”值,而不仅仅是XML结构中的那些值。我正期待着,希望能得到:

代码语言:javascript
运行
复制
XYZ12312312312-ABC,ABCi1
XYZ12312312312-ABC,ABCi2
XYZ12312312312-DEF,DEFi1
XYZ12312312312-DEF,DEFi2

对我做错了什么有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-17 10:33:39

对我做错了什么有什么想法吗?

-m选项嵌套到xsl:for-each语句,因此您需要每个view的所有viewInitiator/@id。要查看生成的XSLT代码,在-C之前添加一个-t选项。

所需的输出可以通过以下方式生成:

代码语言:javascript
运行
复制
xmlstarlet sel -t \
    --var sn='configDump/cluster/@top-level-assembly' \
    -m '//viewInitiator' \
       -v 'concat($sn,"-",../../@name,",",@id)' -n \
< file.xml
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69999152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档