xml - MS Access xml删除父子关系中的外键
问题描述
几天前,我发现了一个与我类似的问题,有一个可能的答案,但我再也找不到了。
我成功地从 Access 输出了我需要的 XML,但有一个例外。
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2019- 02-03T16:38:41">
<CD-Export>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.9</price>
<CD-Years-Export>
<title>Empire Burlesque</title>
<year>1985</year>
</CD-Years-Export>
<CD-Years-Export>
<title>Empire Burlesque</title>
<year>1986</year>
</CD-Years-Export>
<CD-Years-Export>
<title>Empire Burlesque</title>
<year>1987</year>
</CD-Years-Export>
</CD-Export>
我相信我应该使用 XSLT 文件来删除外键
<title>
from the <CD-Years-Export> segment
有人可以提供一个可用于从子节点中删除外键的示例 XSLT 转换吗?
解决方案
考虑以下任何XSLT 脚本:
空模板
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <!-- IDENTITY TRANSFORM --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- EMPTY TEMPLATE TO REMOVE NODE --> <xsl:template match="CD-Years-Export/title"/> </xsl:stylesheet>
排除节点
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <!-- IDENTITY TRANSFORM --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="CD-Years-Export"> <xsl:copy> <!-- EXCLUDE title NODE IN TREE REWRITE --> <xsl:apply-templates select="year"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
重写父节点
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <!-- WALK DOWN TREE FROM ROOT --> <xsl:template match="dataroot"> <xsl:copy> <xsl:apply-templates select="CD-Export"/> </xsl:copy> </xsl:template> <!-- COPY ALL BUT PARENT --> <xsl:template match="CD-Export"> <xsl:copy> <xsl:copy-of select="*[name()!='CD-Years-Export']"/> <xsl:apply-templates select="CD-Years-Export"/> </xsl:copy> </xsl:template> <!-- RE-WRITE PARENT NODE --> <xsl:template match="CD-Years-Export"> <xsl:copy> <xsl:copy-of select="year"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Muenchian 方法 (按不同标题分组)
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="title_key" match="CD-Years-Export" use="title"/> <xsl:template match="dataroot"> <xsl:copy> <xsl:apply-templates select="CD-Export"/> </xsl:copy> </xsl:template> <xsl:template match="CD-Export"> <xsl:copy> <xsl:copy-of select="*[name()!='CD-Years-Export']"/> <!-- ITERATE THROUGH EACH DISTINCT title --> <xsl:for-each select="CD-Years-Export[generate-id() = generate-id(key('title_key', title)[1])]"> <!-- RE-WRITE NODE FOR EACH DISTINCT title --> <xsl:for-each select="key('title_key', title)"> <xsl:copy> <xsl:copy-of select="year"/> </xsl:copy> </xsl:for-each> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet>
Muenchian 方法 (不
xsl:for-each
使用模式模板)<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="title_key" match="CD-Years-Export" use="title"/> <xsl:template match="dataroot"> <xsl:copy> <xsl:apply-templates select="CD-Export"/> </xsl:copy> </xsl:template> <xsl:template match="CD-Export"> <xsl:copy> <xsl:copy-of select="*[name()!='CD-Years-Export']"/> <!-- ITERATE THROUGH EACH DISTINCT title --> <xsl:apply-templates select="CD-Years-Export[generate-id() = generate-id(key('title_key', title)[1])]"/> </xsl:copy> </xsl:template> <xsl:template match="CD-Years-Export"> <!-- RE-WRITE NODE FOR EACH DISTINCT title --> <xsl:apply-templates select="key('title_key', title)" mode="group"/> </xsl:template> <xsl:template match="CD-Years-Export" mode="group"> <xsl:copy> <!-- RE-WRITE NODE FOR EACH DISTINCT title --> <xsl:copy-of select="year"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
推荐阅读
- angular - 来自官方 Angular 脚本的错误
- android - Eclipse:Gluon 移动魅力关闭 VideoService - 未找到
- vba - 当具有相同主题的新邮件到达时,Outlook 宏将删除旧邮件
- c# - CopyAsync 中的 UnauthorizedAccessException
- javascript - 删除字符串中的重复字符并制作唯一的字符串
- python - 特定时间的 Django Celery 定期任务
- neural-network - 如何让语音助手处理科学术语?
- firebase - firebase 可以符合 PIPPA 和 HIPPA 标准吗?
- ruby-on-rails - 在 ruby thor CLI 中的任务之间共享单例
- node.js - 如果请求同时出现,节点 js 会话将替换