使用 xmlstarlet 更新现有 xml 文件元素的属性和值

问题描述 投票:0回答:1

我想编写一个脚本来迭代每个元素“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>
xml xmlstarlet
1个回答
0
投票

看起来您正在尝试修改我的上一个答案,但不太了解 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>
© www.soinside.com 2019 - 2024. All rights reserved.