首页 > 解决方案 > 使用 XSLT 从 XML 中删除标签

问题描述

我有一个 XML,我想在其中删除一些标签并需要将元素保留在下面是示例。示例 XML:

<aggRes>
   <services>
      <serviceIdentifier>vStatus</serviceIdentifier>
      <body>
         <vStatusResponse>
            <Access>Y</Access>
         </vStatusResponse>
      </body>
   </services>
   <services>
      <serviceIdentifier>vRules</serviceIdentifier>
      <body>
         <vRulesResponse>
            <Access>Y</Access>
         </vRulesResponse>
      </body>
   </services>
   <services>
      <serviceIdentifier>vAppAccess</serviceIdentifier>
      <body>
         <vAppAccessResponse>
            <Access>Y</Access>
         </vAppAccessResponse>
      </body>
   </services>
</aggRes>

所需输出:

<aggRes>
   <services>
      <serviceIdentifier>vStatus</serviceIdentifier>
      <Access>Y</Access>
   </services>
   <services>
      <serviceIdentifier>vRules</serviceIdentifier>
      <Access>Y</Access>
   </services>
   <services>
      <serviceIdentifier>vAppAccess</serviceIdentifier>
      <Access>Y</Access>
   </services>
</aggRes>

我尝试使用这个 XSLT 代码: XSLT 代码:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*" />
         <xsl:apply-templates />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="body">
      <xsl:copy-of select="node()" />
   </xsl:template>
   <xsl:template match="vStatusResponse">
      <xsl:copy-of select="node()" />
   </xsl:template>
</xsl:stylesheet>

它没有按预期工作。有人可以帮助如何获得所需的 XML。

标签: xmlxslt

解决方案


你想要<xsl:apply-templates>,不是<xsl:copy-of>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes" />
    <xsl:strip-space elements="*" />

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

一个不太明确(因此可能更灵活)的替代方案是

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

两种情况下的输出:

<aggRes>
   <services>
      <serviceIdentifier>vStatus</serviceIdentifier>
      <Access>Y</Access>
   </services>
   <services>
      <serviceIdentifier>vRules</serviceIdentifier>
      <Access>Y</Access>
   </services>
   <services>
      <serviceIdentifier>vAppAccess</serviceIdentifier>
      <Access>Y</Access>
   </services>
</aggRes>

推荐阅读