这是一些示例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中删除文本“这是一个测试”,而又不影响要保留的节点的内部数据?
答案 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 -->
此副本
root
,type3
和type7
元素type3
和type7
元素的所有子元素type3
或type7
后代的所有文本