如果值是字符串,如何清除xslt中的元素值

时间:2013-10-31 18:17:34

标签: 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()">
    <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>

请帮助谢谢

3 个答案:

答案 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()。这将清除我上面的​​所有三个例子。