从XSLT中删除XML中无用的标记

时间:2016-04-29 07:41:06

标签: xml xslt

我在XML中有以下输出,我在从内容中删除无用标签时遇到问题。我有以下XML值:

<Site EntityType="2" Identifier="CL">
  <Name Last="Rai"/>
  <Address/>
    <Contacts>
      <Contact>
        <Number/>
          </Contact>
      </Contacts>
</Site>

我的问题是如何使用XSLT从上面的XML中删除无用的标签?

欲望输出是这样的:

<Site EntityType="2" Identifier="CL">
  <Name Last="Rai"/>    
</Site>

在上面的输入<Address/>中,<Contacts>...</Contacts>毫无意义,因此我们删除了这些内容。

1 个答案:

答案 0 :(得分:2)

在这种情况下,您应该从身份模板开始,该模板将复制所有现有节点和属性

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

这意味着您只需要为要删除的节点编写模板。带你定义&#34;无用的&#34; as&#34;没有后代文本节点(或处理指令)的元素,没有属性,没有属性&#34;的后代元素,那么模板匹配你喜欢这个

 <xsl:template match="*[not(descendant-or-self::*/@*|descendant::text()[normalize-space()]|descendant::processing-instruction())]" />

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*[not(descendant-or-self::*/@*|descendant::text()[normalize-space()]|descendant::processing-instruction())]" />
</xsl:stylesheet>

或者,如果您使用xsl:strip-space,则可以稍微调整一下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*[not(descendant-or-self::*/@*|descendant::text()|descendant::processing-instruction())]" />
</xsl:stylesheet>