我有这个样本Xml文档
<root>
<type1></type1>
<type2>
<text>
This is a test
</text>
</type2>
<type3>
<child>3</child>
</type3>
<type4></type4>
<type5></type5>
<type6></type6>
<type7>
<text>
This is a test
</text>
<child>7</child>
</type7>
</root>
我希望最终输出仅包含来自type3和type7的数据
<root>
<type3>
<child>3</child>
</type3>
<type7>
<text>
This is a test
</text>
<child>7</child>
</type7>
</root>
我正在使用XSLT尝试产生以上输出
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*" />
<xsl:template match="root | type3 | type7 | *[ancestor::type3] | *[ancestor::type7] | comment() | processing-instruction() | @*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但这会产生输出
<root>
This is a test
<type3>
<child>3</child>
</type3>
<type7>
<text> This is a test </text>
<child>7</child>
</type7>
</root>
如何阻止xml将文本保留在不想保留的区域(如2型节点)中?我知道此问题是由于默认的内置模板引起的,但我不确定如何解决它。
答案 0 :(得分:1)
解决方案是
<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()" />