如果元素值是特定字符串值
,我只想清除元素值输入xml
<A>
<B>
<C>BOLD</C>
</B>
</A>
期望输出
<A>
<B>
<C/>
</B>
</A>
我的xslt看起来像下面哪个不起作用它只是清除所有内容
<xsl:template match="A/B/C/text()">
<xsl:if test="text()='BOLD'">
<xsl:text></xsl:text>
</xsl:if>
</xsl:template>
<!--Copy the rest of the document as it is-->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
请帮助谢谢
答案 0 :(得分:1)
如果文本不是 "BOLD"
,则第一个模板中的逻辑不会输出任何内容,因此如果文本为粗体,则不会吐出任何内容,否则它仍会吐出没有。此外,text()
节点将没有自己的文本。
所以,用它替换第一个模板,它应该可以正常工作。
<xsl:template match="A/B/C/text()">
<xsl:if test="not(.='BOLD')">
<xsl:copy/>
</xsl:if>
</xsl:template>
适用于此:
<A>
<B>
<C>Bold</C>
<C>BOLD</C>
<C>Italic</C>
</B>
</A>
给出这个:
<A>
<B>
<C>Bold</C>
<C/>
<C>Italic</C>
</B>
</A>
答案 1 :(得分:1)
解决此问题的另一种方法是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[text()='BOLD']">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:1)
鉴于您已经开始使用身份模板,实际上不需要使用显式xsl:if
,只需将条件放在空模板的匹配表达式中:
<xsl:template match="A/B/C/text()[. = 'BOLD']"/>
不在A/B/C
下或其内容不是BOLD
的文本节点将由身份模板处理并正常复制。
在匹配表达式中使用text()
的警告是,它意味着模板一次只查看一个文本节点,并且只查看直接位于C
元素内的文本。如果C
可以包含其他内容,您将获得一些奇怪的边缘情况:
<C>BOLD<br/></C> --> <C><br/></C>
<C><b>B</b>OLD</C> --> unchanged
<C><b>BOLD</b></C> --> unchanged
如果您想将C下的全文视为一个单元而不考虑子元素,那么您需要更像
的内容<xsl:template match="C[. = 'BOLD']">
<C/>
</xsl:template>
未提及text()
。这将清除我上面的所有三个例子。