如何将xml属性的值映射到其他一些值

时间:2012-01-20 17:48:04

标签: xslt map attributes transform

我有一个类似于以下内容的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通过该文件多次。显然,这种解决方案非常低效,根本无法扩展。

1 个答案:

答案 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>

<强>解释

  1. value属性覆盖 identity template ,其值等于地图中的from属性。

  2. 地图在转化中以内嵌方式显示,并使用 document() 功能进行访问。或者,包含地图的文件的文件路径可以作为外部参数传递给转换,并且可以再次使用 document() 函数访问Map XML文档,并将其作为参数传递给它文件路径。