使用XSLT剥离除XML之外的所有元素

时间:2010-09-23 07:52:44

标签: xml xslt

除了名为< source>的元素的内容之外,我想从XML中删除所有元素。 E.g:

<root>
 <a>This will be stripped off</a>
 <source>But this not</source>
</root>

XSLT之后:

But this not

我试过这个,但没有运气(没有输出):

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

 <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="source">
      <xsl:copy>
         <xsl:apply-templates select="node()"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|node()">

</xsl:stylesheet>

来自评论

  

在我的真实XML中,我有源代码   不同名称空间中的元素我需要   谷歌如何创建一个匹配   不同元素的模式   命名空间。我想把每个   提取的字符串也是换行符; - )

2 个答案:

答案 0 :(得分:4)

你离我不远。您没有获得任何输出的原因是因为您的根匹配所有模板没有递归但只是终止所以您需要在其中放置apply-templates调用。以下样式表给出了预期的输出。

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

    <xsl:output method="text"/>

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

    <xsl:template match="source">
        <xsl:value-of select="text()"/>
    </xsl:template>

</xsl:stylesheet>

请注意,我已将输出模式更改为textsource模板,只是输出节点的文本值,因为它看起来像是要文本而不是XML输出。

答案 1 :(得分:0)

只是为了好玩,最短的解决方案:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ex="http://example.org">
    <xsl:output method="text"/>
    <xsl:template match="text()"/>
    <xsl:template match="ex:source">
        <xsl:value-of select="concat(.,'&#xA;')"/>
    </xsl:template>
</xsl:stylesheet>

使用此输入:

<root xmlns="http://example.org">
    <a>This will be stripped off</a>
    <source>But this not</source>
</root>

输出:

But this not