我有一个类似于以下内容的XML文件:
<a>
<b value="a123" />
<b value="b234" />
<b value="c345" />
</a>
我需要将属性映射到其他值。例如,我想将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>
也许有比XSLT更好的工具来进行这样的转换?目前我只是sed
通过该文件多次。显然,这种解决方案非常低效,根本无法扩展。
答案 0 :(得分:8)
这么简单:
<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>
<强>解释强>:
为value
属性覆盖 identity template ,其值等于地图中的from
属性。
地图在转化中以内嵌方式显示,并使用 document()
功能进行访问。或者,包含地图的文件的文件路径可以作为外部参数传递给转换,并且可以再次使用 document()
函数访问Map XML文档,并将其作为参数传递给它文件路径。