xslt – 如何将xml属性的值映射到其他一些值
发布时间:2020-12-16 22:42:22 所属栏目:百科 来源:网络整理
导读:我有一个类似于以下的 XML文件: a b value="a123" / b value="b234" / b value="c345" //a 我需要将属性映射到其他值.例如,我想用q999替换a123,用z998替换b234,用u997替换c345.是否可以使用XSLT有效地进行此类转换?生成映射本身,因此我可以将其转换为几乎
我有一个类似于以下的
XML文件:
<a> <b value="a123" /> <b value="b234" /> <b value="c345" /> </a> 我需要将属性映射到其他值.例如,我想用q999替换a123,用z998替换b234,用u997替换c345.是否可以使用XSLT有效地进行此类转换?生成映射本身,因此我可以将其转换为几乎任何格式.现在,让我们说它是以下XML文件: <map> <item from="c345" to="u997" /> <item from="b234" to="z998" /> <item from="a123" to="q999" /> </map> 也许有比XSLT更好的工具来进行这样的转换?目前我只是多次查看该文件.显然,这种解决方案非常低效,根本无法扩展. 解决方法
就这么简单:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <my:map> <map> <item from="c345" to="u997" /> <item from="b234" to="z998" /> <item from="a123" to="q999" /> </map> </my:map> <xsl:variable name="vMap" select= "document('')/*/my:map/*/*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match= "@value[. = document('')/*/my:map/*/*/@from]"> <xsl:attribute name="value"> <xsl:value-of select="$vMap[@from = current()]/@to"/> </xsl:attribute> </xsl:template> </xsl:stylesheet> 当此转换应用于提供的XML文档时: <a> <b value="a123" /> <b value="b234" /> <b value="c345" /> </a> 产生了想要的正确结果: <a> <b value="q999"/> <b value="z998"/> <b value="u997"/> </a> 说明: >为值属性覆盖identity template,其值等于地图中的from属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |