xslt - 替换节点后的文本

标签 xslt replace

我正在尝试从此 XML 中删除“隐藏此数据”,该 XML 是通过限定符 type="noView"进行的

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

我正在使用这个 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”属性,并且可以添加“DELETED”文本。但是我需要删除下面的“隐藏此数据”文本。

我想要的输出是

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

最佳答案

此转换正确地产生了所需的结果:

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

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

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

产生了所需的结果:

<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 设计模式之一

关于xslt - 替换节点后的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2511458/

相关文章:

Javascript:替换 'g' 字符

java - Java 中使用正则表达式进行搜索和替换

xslt - 字符串序列与空字符串的比较

regex - 当连字符围绕单个内部字符时如何替换词内连字符

php - CKEDITOR 和 javascript 函数出现问题

ios - stringByReplacingCharactersInRange 不起作用?

xml - XSL 到 XML 循环问题

xml - 使用 xml namespace 进行 XSLT 转换 我想我错过了一些东西

c# - 在我的 XSL 文件中包含一个 C# (.cs) 文件以便我可以使用智能感知?

xml - 什么是 strip 错误?