首页 > 解决方案 > 使用 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>

标签: c#xsltxpath

解决方案


只需将 XSLT 的第二个模板更改为空模板:

<xsl:template match="contents" />

此外,如果您想保留名称空间(以保持 XML 的其余部分“原样”),您可以简单地使用标识模板:

<!-- identity template -->
<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*" />
  </xsl:copy>
</xsl:template> 

推荐阅读