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_Replace - Fatal编程技术网

Xslt 在节点后替换文本

Xslt 在节点后替换文本,xslt,replace,Xslt,Replace,我正在尝试从这个XML中删除“隐藏此数据”,该XML将继续使用限定符type=“noView” 很好 隐藏此数据 我正在使用这个XSL <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="node()|@*"> <xsl:copy>

我正在尝试从这个XML中删除“隐藏此数据”,该XML将继续使用限定符type=“noView”


很好
隐藏此数据
我正在使用这个XSL

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="@*"/>
       <xsl:apply-templates/>
     </xsl:copy>
   </xsl:template>

<xsl:template match="qualifier">
   <xsl:call-template name="replace-noview" />
 </xsl:template>

<xsl:template name="replace-noview">
  <xsl:param name="text" select="@type"/>

  <xsl:choose>
  <xsl:when test="contains($text, 'noView')">
    <xsl:copy-of select="."/>
    <xsl:text>DELETED</xsl:text>
  </xsl:when>
  <xsl:otherwise>
    <xsl:copy-of select="."/>
  </xsl:otherwise>
  </xsl:choose>
 </xsl:template>

删除

我得到的结果是

<element identifier="ContactName" version="Local">
<qualifier name="Public" type="View" />
Good to go 
</element>
<element identifier="ContactName" version="Local">
<qualifier name="Public" type="noView" />DELETED 
Hide this data 
</element>

很好
删除
隐藏此数据
我正在匹配“noView”属性,可以添加“已删除”文本。但是,我需要删除下面的“隐藏此数据”文本

我想要的输出是

<element identifier="ContactName" version="Local">
<qualifier name="Public" type="View" />
Good to go 
</element>
<element identifier="ContactName" version="Local">
<qualifier name="Public" type="noView" />
DELETED 
</element>

很好
删除

假设元素可以包含多个文本。。。请尝试以下样式表:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="xml"/>

  <xsl:template match="*|@*">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:choose>
      <xsl:when test="preceding-sibling::*[1][local-name() = 'qualifier' and @type='noView']">
    DELETED
  </xsl:when>
      <xsl:otherwise>
        <xsl:copy-of select="."/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

删除
间距与
choose
元素中的输出相关。所以它在输出中看起来不错


如果元素只包含一个前缀为
限定符的文本,则样式设置会更简单。

此转换正确地生成所需的结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text()
  [preceding-sibling::*[1]/@type='noView']">
  <xsl:text>DELETED</xsl:text>
 </xsl:template>
</xsl:stylesheet>
<t>
 <element version="Local">
   <qualifier name="Public" type="View">
</qualifier>
    Good to go
 </element>
 <element version="Local">
 <qualifier name="Public" type="noView">
</qualifier>DELETED</element>
</t>

删除
应用于提供的XML文档时(更正为格式正确):


很好
隐藏此数据
产生所需结果

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text()
  [preceding-sibling::*[1]/@type='noView']">
  <xsl:text>DELETED</xsl:text>
 </xsl:template>
</xsl:stylesheet>
<t>
 <element version="Local">
   <qualifier name="Public" type="View">
</qualifier>
    Good to go
 </element>
 <element version="Local">
 <qualifier name="Public" type="noView">
</qualifier>DELETED</element>
</t>

很好
删除
注意仅对需要特殊处理的文本节点使用标识规则及其覆盖使用和覆盖标识规则是最基本的XSLT设计模式之一

好问题!(+1). 请参阅我的答案,以获得简洁的解决方案。请注意,标识规则的使用及其覆盖仅适用于需要特殊处理的文本节点。使用和重写标识规则是最基本的XSLT设计模式之一。