使用XSLT反转数据和属性

时间:2011-05-01 17:17:36

标签: xml xslt

使用XSLT我想转换这个XML:

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

进入这个XML:

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

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

感谢你们的帮助!

2 个答案:

答案 0 :(得分:2)

我没试过这个,但是这样的事情应该有效:

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

答案 1 :(得分:1)

完整而简短的解决方案

<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. 建议使用
  3. 使用AVT Attribute-Value-Templates ),因为它需要更少的输入,从而产生更短,更易理解和可维护的代码。

  4. 几乎所有XSLT指令的属性都有一些例外(特别是select属性)允许AVT。