xml - 更新 xml 值的脚本

标签 xml linux xslt awk gawk


我正在尝试使用 AWK 脚本根据条件对 xml 文件进行更新。谁能帮我解决这个问题?

students.xml

<students>
    <student>
        <stuId>1</stuId>
        <name>A</name>
        <mark>75</mark>
        <result></result>
    </student>
    <student>
        <stuId>2</stuId>
        <name>B</name>
        <mark>35</mark>
        <result></result>
    </student>
    <student>
        <stuId>1</stuId>
        <name>C</name>
        <mark>94</mark>
        <result></result>
    </student>
</students>

到目前为止我尝试过的代码

我可以使用下面的代码提取标签值

BEGIN { RS="<[^>]+>" } 
{ print  RT, $0 }

这会按预期打印所有标签和值。

我想更新 <result>如果标记> 40,则标记为通过,否则失败

输出

<students>
    <student>
        <stuId>1</stuId>
        <name>A</name>
        <mark>75</mark>
        <result>pass</result>
    </student>
    <student>
        <stuId>2</stuId>
        <name>B</name>
        <mark>35</mark>
        <result>fail</result>
    </student>
    <student>
        <stuId>1</stuId>
        <name>C</name>
        <mark>94</mark>
        <result>pass</result>
    </student>
</students>

有人可以帮我解决这个问题吗?

最佳答案

另一种选择是使用 ed (edit) commandxmlstarlet ...

xmlstarlet ed -L -u "//student[mark >= 40]/result" -v "pass" -u "//student[40 > mark]/result" -v "fail" students.xml

注意:命令行中的 -L 将就地编辑文件。如果这不是您想要的行为,请务必将其删除。

您还可以将 XSLT 1.0 与 xmlstartlet(tr (transform) command)结合使用...

更新.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="student[mark >= 40]/result">
    <xsl:copy>pass</xsl:copy>
  </xsl:template>

  <xsl:template match="student[40 > mark]/result">
    <xsl:copy>fail</xsl:copy>
  </xsl:template>

</xsl:stylesheet>

命令行

xmlstarlet tr update.xsl students.xml

关于xml - 更新 xml 值的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49311030/

相关文章:

xslt - 如何在xsl中引用变量:text element?

xml - Groovy 用 xpath 替换 xml 中的节点值

c# - 在 C# 中将关系数据库映射到 XML

linux - 用于连接到 sql server 数据库服务器并从文件中插入结果的 shell 脚本

linux - 无法使用 sed 将文本替换为 shell 变量

php - 数据未插入生产站点的数据库

c# - 如何对xml文件进行单元测试?

xml - 马克逻辑 8 : Cannot load a XML document to MarkLogic database using cURL

xml - 用 xsl :text? 解释换行符

xml - 您可以使用 XSL 将行分隔列表转换为正确的 xhtml 列表吗?