Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果值是字符串,如何清除xslt中的元素值_Xslt_Xslt 1.0_Xslt 2.0 - Fatal编程技术网

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

如果值是字符串,如何清除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(

我只想清除一个元素值,如果元素值是一个特定的字符串值

输入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>


请帮助,谢谢

如果文本不是
“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>