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

发布于 2024-12-28 03:22:46 字数 629 浏览 4 评论 0原文

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

<a>
  <b value="a123" />
  <b value="b234" />
  <b value="c345" />
</a>

我需要将属性映射到其他值。例如,我想将 a123 替换为 q999,将 b234 替换为 z998c345 > 与u997。使用 XSLT 是否可以有效地进行此类转换?映射本身是生成的,因此我可以将其转换为几乎任何格式。现在,假设它是以下 XML 文件:

<map>
  <item from="c345" to="u997" />
  <item from="b234" to="z998" />
  <item from="a123" to="q999" />
</map>

也许有比 XSLT 更好的工具来执行此类转换?目前我只是通过该文件多次 sed 。显然,这个解决方案效率极低,而且根本无法扩展。

I have a XML file similar to the following:

<a>
  <b value="a123" />
  <b value="b234" />
  <b value="c345" />
</a>

I need to map the attributes to some other value. For example, I want to replace a123 with q999, b234 with z998 and c345 with u997. Is it possible to do such transformation efficiently using XSLT? The mapping itself is generated, so I can convert it into almost any format. For now, let's say it's the following XML file:

<map>
  <item from="c345" to="u997" />
  <item from="b234" to="z998" />
  <item from="a123" to="q999" />
</map>

Maybe there's a better tool than XSLT to do such transformation? Currently I just sed through the file many times. Obviously this solution is horribly inefficient and doesn't scale at all.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

×纯※雪 2025-01-04 03:22:47

就这么简单

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

解释< /strong>:

  1. 覆盖身份模板 对于 value 属性whos 值等于地图中的 from 属性。

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

As easy as this:

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

when this transformation is applied on the provided XML document:

<a>
    <b value="a123" />
    <b value="b234" />
    <b value="c345" />
</a>

the wanted, correct result is produced:

<a>
   <b value="q999"/>
   <b value="z998"/>
   <b value="u997"/>
</a>

Explanation:

  1. Overriding the identity template for value attributes whos value is equal to a from attribute in the map.

  2. The map is presented inline in the transformation and accessed using the document() function. Alternatively, the filepath to the file containing the map can be passed as external parameter to the transformation and the Map XML document can be accessed using again the document() function, passing as argument to it this filepath.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文