3 xslt attributes transform map
我有一个类似于以下的XML文件:
<a>
<b value="a123" />
<b value="b234" />
<b value="c345" />
</a>
Run Code Online (Sandbox Code Playgroud)
我需要将属性映射到其他值.例如,我想替换a123用q999,b234用z998而c345用u997.是否有可能使用XSLT有效地进行此类转换?生成映射本身,因此我可以将其转换为几乎任何格式.现在,让我们说它是以下XML文件:
<map>
<item from="c345" to="u997" />
<item from="b234" to="z998" />
<item from="a123" to="q999" />
</map>
Run Code Online (Sandbox Code Playgroud)
也许有比XSLT更好的工具来进行这样的转换?目前我只是sed通过该文件多次.显然,这种解决方案非常低效,根本无法扩展.
就这么简单:
<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>
Run Code Online (Sandbox Code Playgroud)
当此转换应用于提供的XML文档时:
<a>
<b value="a123" />
<b value="b234" />
<b value="c345" />
</a>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
<a>
<b value="q999"/>
<b value="z998"/>
<b value="u997"/>
</a>
Run Code Online (Sandbox Code Playgroud)
说明:
覆盖属性的标识模板,其value值等于from地图中的属性.
地图在转换中以内联方式显示,并使用该document()函数进行访问.或者,包含映射的文件的文件路径可以作为外部参数传递给转换,并且可以再次使用该document()函数访问Map XML文档,并将该文件路径作为参数传递给它.
| 归档时间: |
|
| 查看次数: |
4335 次 |
| 最近记录: |