几天前我发现了一个与我类似的问题,并给出了可能的答案,但我再也找不到了。
我成功地从 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>