c# - 使用 XPath 或 XSLT 从 XML 中排除特定元素
问题描述
考虑以下 XML:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<price>30.00</price>
<contents>jjjadLKjlkdasndlakjd...</contents>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<price>29.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<price>39.95</price>
<contents>jjjadLKjlkdasndlakjd...</contents>
</book>
</bookstore>
目标是排除“内容”元素并获得生成的 XML AS-IS。
我尝试了轴和其他运算符。但是,使用 XPath 似乎无法实现这一点。如果我错了,请纠正我。
如果 XPath 解决方案不可能,以下 XSLT 可以工作吗?
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8"/>
<!-- For each element, create a new element with the same local-name (no namespace) -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="*[not(self::company)]"/>
</xsl:template>
</xsl:stylesheet>
解决方案
只需将 XSLT 的第二个模板更改为空模板:
<xsl:template match="contents" />
此外,如果您想保留名称空间(以保持 XML 的其余部分“原样”),您可以简单地使用标识模板:
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
推荐阅读
- r - 如何编辑自己的 k-means 函数,以便将簇作为输入而不是 R 中的中心?
- c++ - 对时间复杂度与哈希映射的混淆
- google-cloud-platform - GKE Secrets 或 Google 机密管理器
- python - 获取具有特定角色 discord bot 的所有成员的列表
- php - 获取 Facebook 图片 URL
- tfs - Tfs 工作项搜索不返回包含
- javascript - 如何使用http模块将嵌套对象转换为节点中的查询字符串
- javascript - 反应状态给出未定义的新反应
- node.js - 使用 TypeScript 3 的 Node.js Express API 更新记录
- html - 单击 django 中的 href 链接时出现意外/不需要的 url 路径