我基本上在寻找一个XSLT(比如一个可调用的模板),它将输入一个xml和一个要在XML中删除的元素,并在删除XML中的特定元素后返回最终的XML。 / p>
示例:
<Request>
<Activity1>XYZ</Activity1>
<Activity2>ABC</Activity2>
</Request>
现在我需要一个xslt,我必须将上面的xml作为输入,并将要删除的元素(Say <Activity1>
)作为输入。删除传递给它的元素后,XSLT必须返回最终的xml。
答案 0 :(得分:1)
您可以使用修改后的副本模板:
<xsl:stylesheet ...>
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:variable name="removeNode">Activity1</xsl:variable>
<xsl:template match="node()">
<xsl:if test="not(name()=$removeNode)">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="@*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
如何将参数传递给yout模板取决于您使用的XSLT处理器。
修改强>
另一种可能性是在需要时忽略节点:
<xsl:template match="/">
<xsl:apply-templates select="*/*[not(self::element-to-ignore)]"
mode="renderResult"/>
</xsl:template>
<xsl:template match="@*|node()" mode="renderResult">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="renderResult"/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:0)
这是一个通用转换,它接受一个全局(外部指定的)参数以及要删除的元素的名称:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pDeleteName" select="'c'"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:if test="not(name() = $pDeleteName)">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
应用于任何XML文档(例如以下内容):
<a>
<b>
<c/>
<d>
<e>
<c>
<f/>
</c>
<g/>
</e>
</d>
</b>
</a>
生成了正确的结果 - 源XML文档中名称与pDeleteName
参数中的字符串相同的任何元素 - 被删除:
<a>
<b>
<d>
<e>
<g/>
</e>
</d>
</b>
</a>
可以清楚地看到,元素<c>
的任何出现都已被删除。