XSLT:修复了从所有区域输出文本的问题

时间:2018-06-27 16:25:26

标签: xml xslt

我有这个样本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型节点)中?我知道此问题是由于默认的内置模板引起的,但我不确定如何解决它。

1 个答案:

答案 0 :(得分:1)

解决方案在This StackOverflow post

中给出

解决方案是

<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()" />