如何编写删除某些xml元素的xsl转换

时间:2018-06-27 14:40:08

标签: xml xslt

这是一些示例xml

<root>
    <type1></type1>
    <type2></type2>
    <type3>
        <child>3</child>
    </type3>
    <type4></type4>
    <type5></type5>
    <type6></type6>
    <type7>
        <child>7</child>
    </type7>
</root>

我想剥离除type3和type7以外的所有元素,使其看起来像这样:

<root>
    <type3>
        <child>3</child>
    </type3>
    <type7>
        <child>7</child>
    </type7>
</root>

我是xsl的新手,这就是我尝试过的

<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/" >
<xsl:apply-templates/>
  </xsl:template>

  <xsl:template name="Type3">
    <xsl:copy-of select="*"/>
  </xsl:template>

 <xsl:template name="Type7">
    <xsl:copy-of select="*"/>
  </xsl:template>

</xsl:stylesheet>

但是,这仅从子节点输出内部3和7。我在这里的想法怎么了?

更新

虽然下面的答案适用于这种情况,但我现在仍然停留在这个问题上。我有xml

<root>
    <type1></type1>
    <type2>
        <text>
           This is a test
        </text>
    </type2>

    <type3>
        <child>3</child>
    </type3>
    <type4></type4>
    <type5></type5>
    <type6></type6>
    <type7>
        <child>7</child>
    </type7>
</root>

XSl提供了输出:

<root>
    This is a test
    <type3>
      <child>3></child>
    </type3>
    <type7>
      <child>7</child>
    </type7>
</root>

如何在最终xml中删除文本“这是一个测试”,而又不影响要保留的节点的内部数据?

1 个答案:

答案 0 :(得分:2)

您可以使用经过修改的身份模板和白名单方法:

<xsl:template match="root | node()[ancestor-or-self::type3] | node()[ancestor-or-self::type7] | comment() | processing-instruction() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template> 

<xsl:template match="text()" />     <!-- remove all text() nodes unless they are whitelisted -->

此副本

  • roottype3type7元素
  • type3type7元素的所有子元素
  • 所有注释,处理指令和属性
  • type3type7后代的所有文本