如果值是字符串,如何清除xslt中的元素值
我只想清除一个元素值,如果元素值是一个特定的字符串值 输入xml如果值是字符串,如何清除xslt中的元素值,xslt,xslt-1.0,xslt-2.0,Xslt,Xslt 1.0,Xslt 2.0,我只想清除一个元素值,如果元素值是一个特定的字符串值 输入xml <A> <B> <C>BOLD</C> </B> </A> 大胆的 期望输出 <A> <B> <C/> </B> </A> 我的xslt看起来像下面这样,它不起作用,只是清除了所有内容 <xsl:template match="A/B/C/text(
<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>
请帮助,谢谢如果文本不是
“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>
大胆的
斜体
解决此问题的另一种方法是:
<?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>
如果您是从一个标识模板开始的,那么实际上没有必要使用显式的
xsl:if
,只需将条件放在空模板的匹配表达式中:
<xsl:template match="A/B/C/text()[. = 'BOLD']"/>
如果希望将C下的全文视为一个单元,而不考虑子元素,则需要类似
<xsl:template match="C[. = 'BOLD']">
<C/>
</xsl:template>
没有提到
text()
。这将清除我上面的三个示例。我刚刚在提供的输入上尝试了xslt,它似乎完全按照您的要求工作。因此,如果有任何问题,可能是代码中其他地方没有提供的问题。顺便说一句-text()上的条件='BOLD'您还可以写入模板的match属性(这只是我个人的选择)。@JirkaŠ。最初的输入是错误的,它不可能吐出任何东西。我不确定你做了什么,但它不可能起作用。你是对的,我先更正了xml格式,在我的评论中没有提到它。
<xsl:template match="C[. = 'BOLD']">
<C/>
</xsl:template>