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

3 xslt attributes transform map

我有一个类似于以下的XML文件:

<a>
  <b value="a123" />
  <b value="b234" />
  <b value="c345" />
</a>
Run Code Online (Sandbox Code Playgroud)

我需要将属性映射到其他值.例如,我想替换a123q999,b234z998c345u997.是否有可能使用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通过该文件多次.显然,这种解决方案非常低效,根本无法扩展.

Dim*_*hev 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>
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)

说明:

  1. 覆盖属性的标识模板,其value值等于from地图中的属性.

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