我有一个类似于以下的 XML文件: a b value="a123" / b value="b234" / b value="c345" //a 我需要将属性映射到其他值.例如,我想用q999替换a123,用z998替换b234,用u997替换c345.是否可以使用XSLT有效地进行此
<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属性.
>地图在转换中以内联方式显示,并使用document()
函数进行访问.或者,包含映射的文件的文件路径可以作为外部参数传递给转换,并且可以再次使用document()
函数访问Map XML文档,并将此文件路径作为参数传递给它.