我想编写一个脚本来迭代每个元素“NewTempP”的属性和子元素,并将结构复制到元素“fig”作为子元素。 “NewTempP”和“fig”是兄弟姐妹。
Xml 文件:
<sec>
<NewTempP mimetype="image" mime-subtype="jpeg" xlink:href="image1.jpeg">
<alt-text>Describes a picture</alt-text>
</NewTempP >
<p>test</p>
<fig> </fig>
<NewTempP mimetype="image" mime-subtype="png" xlink:href="image1.png">
<alt-text>Describes a picture</alt-text>
</NewTempP >
<p>test</p>
<fig> </fig>
……..
<sec>
我做了什么:
xmlstarlet ed -L -P -u "//fig[preceding-sibling::*[1][self:: NewTempP/@*]]/inline-graphic" -x "string(../preceding-sibling::NewTempP [1]/@*)" test.xml
它不起作用。
结果应该是这样的:
<sec>
<NewTempP mimetype="image" mime-subtype="jpeg" xlink:href="image1.jpeg">
<alt-text>Describes a picture</alt-text>
</NewTempP >
<p>test</p>
<fig>
<NewTempP mimetype="image" mime-subtype="jpeg" xlink:href="image1.jpeg">
<alt-text>Describes a picture</alt-text>
</NewTempP >
</fig>
<NewTempP mimetype="image" mime-subtype="png" xlink:href="image1.png">
<alt-text>Describes a picture</alt-text>
</NewTempP >
<p>test</p>
<fig>
<NewTempP mimetype="image" mime-subtype="png" xlink:href="image1.png">
<alt-text>Describes a picture</alt-text>
</NewTempP >
</fig>
……..
<sec>
看起来您正在尝试修改我的上一个答案,但不太了解 XPath 是如何工作的。
您没有解释选择中的实际逻辑应该是什么,但这里有一个选项,仅选择前面的第一个兄弟
NewTempP
...
xmlstarlet ed -P -u "//fig[preceding-sibling::NewTempP]" -x "preceding-sibling::NewTempP[1]" test.xml
输出(我省略了
-L
用于就地修改输入文件)...
<sec>
<NewTempP mimetype="image" mime-subtype="jpeg" xlink:href="image1.jpeg">
<alt-text>Describes a picture</alt-text>
</NewTempP>
<p>test</p>
<fig><NewTempP mimetype="image" mime-subtype="jpeg" xlink:href="image1.jpeg">
<alt-text>Describes a picture</alt-text>
</NewTempP></fig>
<NewTempP mimetype="image" mime-subtype="png" xlink:href="image1.png">
<alt-text>Describes a picture</alt-text>
</NewTempP>
<p>test</p>
<fig><NewTempP mimetype="image" mime-subtype="png" xlink:href="image1.png">
<alt-text>Describes a picture</alt-text>
</NewTempP></fig>
...
</sec>