XSL 转换删除 Xml 元素

2024-02-28

我很困惑。给定一个 xml 文档,例如:

    <Frag>
        <DirRef Id="BeemzDir">
            <Com Id="BEED24F05AB78FB588F61D4092654B6D" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil1" KeyPath="yes" Source="My.Exe" />
            </Com>
            <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
            </Com> 
          </DirRef>
</Frag>
<Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="BEED24F05AB78FB588F61D4092654B6D" />
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
        </ComGroup>  
</Frag> 

我需要使用 xslt 删除包含 Source="My.Exe" 的元素。在本例中,删除元素“Com”,其属性 id=BEED24F05AB78FB588F61D4092654B6D。

我已经这么做了。但我不能做的就是删除 Id=BEED24F05AB78FB588F61D4092654B6D 的“CompRef”元素。

所以在转换之后我希望我的 xml 看起来像:

    <Frag>
        <DirRef Id="BeemzDir">
            <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
            </Com> 
          </DirRef>
</Frag>
<Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
        </ComGroup>  
</Frag> 

任何帮助,将不胜感激。

Update

下面是一些删除“FileName”元素的 xml。

  <xsl:template match="Com/FileName[contains(@Source,'My.Exe')='true']">
  </xsl:template>

所以结果是:

<Frag>
    <DirRef Id="BeemzDir">
        <Com Id="BEED24F05AB78FB588F61D4092654B6D" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">

        </Com>
        <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
            <FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
        </Com> 
          </DirRef>
</Frag>
<Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="BEED24F05AB78FB588F61D4092654B6D" />
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
        </ComGroup>  
</Frag>

更改上面调用 xsl:apply-template 的 xsl 没有任何作用,因为它卡在其运行的节点中。我不知道如何存储要删除的 Id,然后循环它们。

Update 2

可以删除多个节点,即多个“Com”元素,其中 source="MyExe"。此外,ID 是自动生成的,因此每次运行都会有所不同。


这种转变:

<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()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="Com[FileName/@Source='My.Exe']"/>

 <xsl:template match="CompRef[@Id=/*/*/*/Com[FileName/@Source='My.Exe']/@Id]"/>

</xsl:stylesheet>

当应用于提供的 XML 文档时(已更正为格式良好):

<Frags>
    <Frag>
        <DirRef Id="BeemzDir">
            <Com Id="BEED24F05AB78FB588F61D4092654B6D" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil1" KeyPath="yes" Source="My.Exe" />
            </Com>
            <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil2" KeyPath="yes" Source="My.Dll" />
            </Com>
        </DirRef>
    </Frag>
    <Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="BEED24F05AB78FB588F61D4092654B6D" />
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC" />
        </ComGroup>
    </Frag>
</Frags>

产生所需的正确输出:

<Frags>
    <Frag>
        <DirRef Id="BeemzDir">
            <Com Id="FFF24F05AB78FB588F61D4092654CCC" Guid="{A11AB356-2F45-4157-92EF-ED49F5BE0F70}">
                <FileName Id="fil2" KeyPath="yes" Source="My.Dll"/>
            </Com>
        </DirRef>
    </Frag>
    <Frag>
        <ComGroup Id="MyGroup">
            <CompRef Id="FFF24F05AB78FB588F61D4092654CCC"/>
        </ComGroup>
    </Frag>
</Frags>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSL 转换删除 Xml 元素 的相关文章

随机推荐

  • 使用 JQuery Datepicker 仅显示月份

    我希望能够使用JQuery UI 日期选择器 http jqueryui com demos datepicker 允许用户选择特定月份 但无法选择该月中的特定日期 日期选择器上的前进和上一步按钮会将用户带到不同的位置years 而不是不同
  • 需要想法:选择表中的行

    我正在为客户开发一个网站 它需要一种特殊的方式来创建计算 在表中 我必须创建具有相同 End 的行组 由于一开始只有一行 90 日期为 2011 年 11 月 24 日 因此您可以忽略它 例如 我必须选择带有日期的行 2011 年 11 月
  • Xlib 截图调用

    看到问题后如何在Linux中截图 高fps 编程 https stackoverflow com questions 25162580 how to take screenshot high fps in linux programming
  • 是否可以在 SASS 或 LESS 中将一个类或标签别名为另一个类或标签?

    我正在尝试使用 Less 或可能使用 Sass 使我的 bootstrap 2 1 标记更加语义化 考虑 Bootstrap 标准导航栏的以下标记
  • STL自定义分配器来管理不同的内存空间

    我想使用 STL 自定义分配器类的不同实例来管理不同的内存空间 然后能够为 STL 容器指定分配器实例 以便每个容器仅从其分配的内存空间中提取 但我不知道如何才能做到这一点 我了解如何将分配器类型传递到 STL 容器的模板参数中 但我想要类
  • 何时在 Node js 中使用 eventEmitter?

    我正在学习 Node js 中的新概念 即事件 但我找不到应该在哪里使用它 我想要任何真实的场景 但我找不到任何关于此的文章或博客 var events require events var eventEmitter new events
  • Haskell 使用什么类型的范围?

    我试图弄清楚 Haskell 是否使用动态或静态作用域 我意识到 例如 如果您定义 let x 10 然后定义函数 let square x x x 您有 2 个不同的 x 这是否意味着它是动态作用域的 如果不是 它使用什么范围 为什么 另
  • 如何将 json 字符串数据类型列转换为 hive 中的映射数据类型列?

    我需要从所有行中获取所有唯一的键值 每行都有不同的键和值请找到上面的专栏图片 例如 一排看起来像 START TIME 1549002807568 PARSING QUERY FORMED 1549002807586 CUBES WITH
  • Angular 2 路由 - 隐藏 URL

    我知道你可以在路由时隐藏 URLthis router navigate Pages skipLocationChange true 但是当我使用window open Pages 它有网址 有没有办法在使用时隐藏URLwindow ope
  • jquery ajax 中 async:false 和 async:true 有什么区别?

    jquery ajax中有一个参数 ajax async true 将值设置为有什么区别true and false You set async to false 当您需要在浏览器传递给其他代码之前完成 ajax 请求时
  • Python 推送器 AWS Lambda

    使用 AWS Lambda 将推送通知发送到 Python 中的 Pusher 应用程序 当我将 Pusher 及其所有依赖项安装到一个目录并压缩到 Lambda 时 我运行了一个简单的测试并收到此错误 No module named nd
  • 运行jsp文件时类转换异常

    我正在尝试运行我的 jsp 文件之一 但遇到类转换异常 org apache catalina core DefaultInstanceManager 无法转换为 org apache tomcat InstanceManager 我已将所
  • protobuf 具有继承性?

    是否可以使用protobuf http code google com p protobuf 与继承的类 我想做这样的事情 class Expr class AddExpr Expr class CallFunc Expr class Fu
  • Ionic 3:使用蓝牙打印机打印图像

    我目前正在努力使用我们的 Ionic3 应用程序 我似乎不知道如何使用 BT 打印机和蓝牙串行插件打印图像 打印文字就好了 我们正在使用此文档测试 RPP02N BU 打印机 由我的前同事找到 驱动程序命令文档 https www spar
  • cmake 中“不允许源内构建”

    我是 cmake 的新手 我只用它在我的 ubuntu linux 上安装 opencv 这是我运行的命令 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX home jinha O
  • 我的服务器端 PHP 在 reCaptcha 之后仍然遭到黑客攻击(数百封垃圾邮件)

    我之前在 StackOverflow 上提出的问题是 有人每隔几个小时向我发送数百封垃圾邮件 现在 我在服务器端修复了脚本 但第二天早上我仍然收到 30 封电子邮件之类的东西 我的托管公司给了我一个 FTP 的新密码 并将我的索引文件移动到
  • 在 ie8 浏览器中使用 jquery-2.0.3:对象不支持此属性或方法

    我用的是jquery 它在火狐浏览器中运行良好 但是当我用 ie8 打开它时出现同样的错误 对象不支持此属性或方法 834线 我禁用这一行并在这一行中发现相同的错误 836 3316 我制作示例代码并进行测试 它从不显示我的警报
  • 无法将本地 git 导入 Eclipse 来创建新项目(抛出错误“连接 Git 团队提供商失败”)

    我在本地计算机上创建了一个 git 存储库 git init git add TestGit java git commit m Start 然后我进入 Eclipse 并选择从该 Git 存储库导入并创建一个新项目 在向导步骤中 它识别出
  • .NET 控制台应用程序中的越南语字符 (UTF-8)

    我试图将 UTF 8 字符串 越南语 写入 C 控制台 但没有成功 我在 Windows 7 上运行 我尝试使用Encoding转换的类string to char to byte 然后到String 但是没有帮助 字符串是直接从数据库输入
  • XSL 转换删除 Xml 元素

    我很困惑 给定一个 xml 文档 例如