我正在尝试从此 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/