当前位置 : 主页 > 网页制作 > xml >

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

来源:互联网 收集:自由互联 发布时间:2021-06-13
我有一个类似于以下的 XML文件: a b value="a123" / b value="b234" / b value="c345" //a 我需要将属性映射到其他值.例如,我想用q999替换a123,用z998替换b234,用u997替换c345.是否可以使用XSLT有效地进行此
我有一个类似于以下的 XML文件:

<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文档,并将此文件路径作为参数传递给它.

网友评论