我有一個復雜的結構化 XML 檔案,我正在嘗試使用 xmlstartlet 從中決議一些值。我認為問題在于邏輯物件是由元素屬性而不是實際元素名稱標識的。
檔案 test.xml,在這個例子中被簡化,看起來像這樣:
<?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>
我正在嘗試使用如下所示的欄位生成輸出:
<top-level-assembly>-<view-name>,<viewInitiator-ID>
當我運行以下命令時:
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
我得到以下輸出:
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 中該結構中的那些值。我期待并希望得到:
XYZ12312312312-ABC,ABCi1
XYZ12312312312-ABC,ABCi2
XYZ12312312312-DEF,DEFi1
XYZ12312312312-DEF,DEFi2
對我做錯了什么有任何想法嗎?
uj5u.com熱心網友回復:
對我做錯了什么有任何想法嗎?
該-m選項巢-到xsl:for-each報表-所以你問所有的viewInitiator/@idS代表每個view。要查看生成的 XSLT 代碼,請-C在-t.
可以通過以下方式生成所需的輸出:
xmlstarlet sel -t \
--var sn='configDump/cluster/@top-level-assembly' \
-m '//viewInitiator' \
-v 'concat($sn,"-",../../@name,",",@id)' -n \
< file.xml
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359592.html
標籤:xml xml解析 xmlstarlet
