【问题标题】:Deleting items using XSLT使用 XSLT 删除项目
【发布时间】:2020-04-29 14:38:03
【问题描述】:

所以我已经在互联网上搜索了几天,但似乎找不到任何特定于我的问题的内容。当我收到匹配项时,我需要使用 XSLT 转换删除一个项目。我有一个 XPath 表达式,它比较数据库提取和 API 提取并识别两者之间的匹配。我正在尝试使用匹配项并将它们从整个 API 提取中删除。如果我错过了任何需要的信息,我深表歉意,我对 XSLT 还是很陌生。

当前 XML 格式:

<names>
  <name>one</name>
  <name>two</name>
  <name>three</name>
  <name>four</name>
</names>

所需的 XML 输出:

<names>
  <name>one</name>
  <name>two</name>
  <name>four</name>
</names>

在这种情况下,假设我收到了匹配的“三”,XSLT 转换将从 XML 中删除“三”。

【问题讨论】:

    标签: xml xpath transform


    【解决方案1】:

    如果您想避免编写 XSL 程序的麻烦,假设您的系统上安装了 xmlstarlet 并且您的 XML 文件名为 names.xml,您可以发出:

    xmlstarlet edit --delete '//name[text() = "three"]' names.xml
    

    【讨论】:

    • 没有xmlstarlet有什么办法吗?我使用的软件不允许添加任何实用程序。谢谢
    • 请点击 ✓ 符号接受我的解决方案,然后点击 ▲ 进行投票。
    • @Maharshee:您可以使用 XSL 样式表来完成。您对该解决方案感兴趣吗?
    • 感谢您的解决方案!当我尝试接受解决方案时,我得到“感谢您的反馈!声望低于 15 人的投票会被记录,但不要更改公开显示的帖子得分。”非常感谢您的帮助
    【解决方案2】:

    如果xmlstarlet 不可用,您可以使用下一个 XSL 样式表:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output omit-xml-declaration="yes" indent="yes"/>
      <xsl:strip-space elements="*"/>
    
      <xsl:template match="@*|node()">
        <!-- identity transformation -->
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="name[text() = 'three']"/>
        <!-- do nothing, i.e. delete from output -->
    
    </xsl:stylesheet>
    

    【讨论】:

    • 。那么就不需要“什么都不做”模板了。
    • @Dabbler:你是对的,但这个脚本是从我自己的软件厨房的模板生成的。感谢您的改进。
    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多