使用 XSLT 反转数据和属性

发布于 2024-11-04 09:11:03 字数 360 浏览 1 评论 0原文

使用 XSLT 我想将此 XML: 转换

<exchangeRates>
    <rate country="aud">0.97</rate>
</exchangeRates>

为此 XML:

<xchgRates>
    <entry xrate="0.97">aud</entry>
</xchgRates>

编辑:exchangeRates 需要变为 xchgRates。将 xRate 更改为 xrate 以匹配正确的解决方案。

感谢大家的帮助!

Using XSLT I want to tranform this XML:

<exchangeRates>
    <rate country="aud">0.97</rate>
</exchangeRates>

into this XML:

<xchgRates>
    <entry xrate="0.97">aud</entry>
</xchgRates>

EDIT: exchangeRates needs to become xchgRates. Changed xRate to xrate to match correct solution.

Thanks for all your help guys!

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

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

发布评论

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

评论(2

尛丟丟 2024-11-11 09:11:03

我还没有尝试过这个,但类似这样的东西应该有效:

<xsl:template match="exchangeRates/rate">
    <entry>
         <xsl:attribute name="xRate"><xsl:value-of select="." /></xsl:attribute>
         <xsl:value-of select="@country" />
    </entry>
</xsl:template>

I haven't tried this but something like this should work:

<xsl:template match="exchangeRates/rate">
    <entry>
         <xsl:attribute name="xRate"><xsl:value-of select="." /></xsl:attribute>
         <xsl:value-of select="@country" />
    </entry>
</xsl:template>
俯瞰星空 2024-11-11 09:11:03

完整而简短的解决方案

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>


 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="exchangeRates">
  <xchgRates>
   <xsl:apply-templates select="node()|@*"/>
  </xchgRates>
 </xsl:template>

 <xsl:template match="rate">
  <entry xrate="{.}">
   <xsl:value-of select="@country"/>
  </entry>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<exchangeRates>
    <rate country="aud">0.97</rate>
</exchangeRates>

生成所需的正确结果

<xchgRates>
   <entry xrate="0.97">aud</entry>
</xchgRates>

解释

  1. 使用和覆盖身份规则/template

  2. 使用 AVT (属性值模板)是推荐的,因为它需要更少的输入,并且可以生成更短、更易于理解和维护的代码。

除了少数例外(特别是 select 属性)之外,XSLT 指令的几乎所有属性都允许 AVT。

A complete and short solution:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>


 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="exchangeRates">
  <xchgRates>
   <xsl:apply-templates select="node()|@*"/>
  </xchgRates>
 </xsl:template>

 <xsl:template match="rate">
  <entry xrate="{.}">
   <xsl:value-of select="@country"/>
  </entry>
 </xsl:template>
</xsl:stylesheet>

when this transformation is applied on the provided XML document:

<exchangeRates>
    <rate country="aud">0.97</rate>
</exchangeRates>

the wanted, correct result is produced:

<xchgRates>
   <entry xrate="0.97">aud</entry>
</xchgRates>

Explanation:

  1. Using and overriding the identity rule/template

  2. Using AVT (Attribute-Value-Templates) is recommended as it needs less typing and results in shorter, more understandable and maintainable code.

Almost all attributes of the XSLT instructions with a few exceptions (notably the select attribute) allow AVTs.

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