如何删除特定的元素,但不能使用XSLT

问题描述:

里面的文字这是我的XML输入如何删除特定的元素,但不能使用XSLT

<para> 
<a><b>this is a text</b></a> 
</para> 

这是我的期望输出

<para> 
this is a text 
</para> 

如何删除所有的“a”标签和“b”标签只和文本不会受到影响使用xslt谢谢

<xsl:template match="//para"> 
    <xsl:copy> 
     <xsl:value-of select="."></xsl:value-of> 
    </xsl:copy> 
</xsl:template> 

(或避免从其他子元素的空白:

<xsl:template match="//para"> 
    <xsl:copy> 
     <xsl:value-of select="./*/*/text()"></xsl:value-of> 
    </xsl:copy> 
</xsl:template> 
+0

注:马丁的回答的也不错 - 我们已经接洽以不同的方式。他的代码遍历所有元素,如果它看到'a'或'b'只是删除它们,保留任何内容。我的方法找到'para'元素,然后从内部文本(值)拉,而不拉回任何标记。 – JohnLBevan 2015-02-06 09:48:46

+0

之后转型有很多巨大的空间,我怎么能摆脱这个? – LiXin 2015-02-09 05:41:21

+0

好点;这会从段落中的所有元素中删除文本(包括空格);马丁的解决方案在那里更好;或者你可以做一个组合(上面修改)。 – JohnLBevan 2015-02-09 09:38:57

开始与身份转换模板

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

再加入

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

来处理你的元素。

解决问题..

<xsl:strip-space elements="*"/> 
<xsl:template match="*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 

<xsl:template match="//*/text()"> 
    <xsl:if test="normalize-space(.)"> 
    <xsl:value-of select= 
    "concat(normalize-space(.), '&#xA;')"/> 
    </xsl:if> 
    <xsl:apply-templates /> 
</xsl:template> 
<xsl:template match="*[not(node())]" />