如何删除特定的元素,但不能使用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>
答
开始与身份转换模板
<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(.), '
')"/>
</xsl:if>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="*[not(node())]" />
注:马丁的回答的也不错 - 我们已经接洽以不同的方式。他的代码遍历所有元素,如果它看到'a'或'b'只是删除它们,保留任何内容。我的方法找到'para'元素,然后从内部文本(值)拉,而不拉回任何标记。 – JohnLBevan 2015-02-06 09:48:46
之后转型有很多巨大的空间,我怎么能摆脱这个? – LiXin 2015-02-09 05:41:21
好点;这会从段落中的所有元素中删除文本(包括空格);马丁的解决方案在那里更好;或者你可以做一个组合(上面修改)。 – JohnLBevan 2015-02-09 09:38:57