使用XSLT 1基于另一个xml过滤XML
发布时间:2020-12-16 07:59:20 所属栏目:百科 来源:网络整理
导读:我们如何根据另一个xml文档过滤xml文档.我必须删除查找xml中不存在的所有元素.输入xml和lookup xml都有相同的根元素,我们使用的是XSLT 1.0. 输入输入 Root E1 a="1"V1/E1 E2V2/E2 E3V3/E3 E5 SE51SEV1/SE51 SE52SEV2/SE52 /E5 E6 SE61SEV3/SE61 SE62SEV4/SE6
我们如何根据另一个xml文档过滤xml文档.我必须删除查找xml中不存在的所有元素.输入xml和lookup xml都有相同的根元素,我们使用的是XSLT 1.0.
输入输入 <Root> <E1 a="1">V1</E1> <E2>V2</E2> <E3>V3</E3> <E5> <SE51>SEV1</SE51> <SE52>SEV2</SE52> </E5> <E6> <SE61>SEV3</SE61> <SE62>SEV4</SE62> </E6> </Root> 过滤Xml <Root> <E1 a="1"></E1> <E2></E2> <E5> <SE51></SE51> <SE52></SE52> </E5> </Root> 预期产出 <Root> <E1 a="1">V1</E1> <E2>V2</E2> <E5> <SE51>SEv1</SE51> <SE52>SEV2</SE52> </E5> </Root>
这是必需的转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:z="inline:text.xml" exclude-result-prefixes="z" > <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <z:filter> <Root> <E1 a="1"></E1> <E2></E2> <E5> <SE51></SE51> <SE52></SE52> </E5> </Root> </z:filter> <xsl:variable name="vFilter" select= "document('')/*/z:filter"/> <xsl:template match="/"> <xsl:apply-templates select="*[name()=name($vFilter/*)]"> <xsl:with-param name="pFiltNode" select="$vFilter/*"/> </xsl:apply-templates> </xsl:template> <xsl:template match="*"> <xsl:param name="pFiltNode"/> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:for-each select="text() | *"> <xsl:choose> <xsl:when test="self::text()"> <xsl:copy-of select="."/> </xsl:when> <xsl:otherwise> <xsl:variable name="vFiltNode" select="$pFiltNode/*[name()=name(current())]"/> <xsl:apply-templates select="self::node()[$vFiltNode]"> <xsl:with-param name="pFiltNode" select="$vFiltNode"/> </xsl:apply-templates> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet> 当此转换应用于以下XML文档时(原始文档加上< SE511> SEV11< / SE511>的添加,以证明过滤适用于任何级别: <Root> <E1 a="1">V1</E1> <E2>V2</E2> <E3>V3</E3> <E5> <SE51>SEV1</SE51> <SE511>SEV11</SE511> <SE52>SEV2</SE52> </E5> <E6> <SE61>SEV3</SE61> <SE62>SEV4</SE62> </E6> </Root> 产生了想要的结果: <Root> <E1 a="1">V1</E1> <E2>V2</E2> <E3>V3</E3> <E5> <SE51>SEV1</SE51> <SE511>SEV11</SE511> <SE52>SEV2</SE52> </E5> <E6> <SE61>SEV3</SE61> <SE62>SEV4</SE62> </E6> </Root> 请注意此解决方案的以下详细信息: >模板仅应用于filter-document中具有匹配节点的元素,也适用于此类元素的所有文本节点. 享受吧! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |