我有一个类似于以下的 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文档,并将此文件路径作为参数传递给它.
