将一种XML格式转换为另一种XML格式

时间:2019-07-12 11:16:27

标签: xml xslt

我有此XML:请我将其更改为其他格式
我已经尝试过下面的xslt,但是它没有给我我希望您可以在尝试使用的xslt下方找到的输出以及我得到的输出。

<?xml version="1.0"?>
<Offering>
  <!--RCCG PMS to eRemittance offering XML handshake-->
  <!--PARISH & OFFERING REMITTANCE INFO-->
  <INFO><REGION>R20</REGION></INFO>
  <INFO><PARISH>RCCGP1321000050</PARISH></INFO>
  <INFO><OPTION>WEEKLY</OPTION></INFO>
  <INFO><MONTH>May</MONTH></INFO>
  <INFO><YEAR>2019</YEAR></INFO>
  <INFO><WEEK>WK2</WEEK></INFO>
  <INFO><CURRENCY>NGN</CURRENCY></INFO>
  <!--DEFAULT OFFERING-->
  <DEFAULT><MinisterTithe>6870.60</MinisterTithe></DEFAULT>
  <DEFAULT><GeneralTithe>7780.00</GeneralTithe></DEFAULT>
  <DEFAULT><SundayLoveOffering>8860.00</SundayLoveOffering></DEFAULT>
  <DEFAULT><SundaySchool>770.00</SundaySchool></DEFAULT>
  <DEFAULT><HappyOffering>4440.00</HappyOffering></DEFAULT>
  <DEFAULT><CRM>0.00</CRM></DEFAULT>
  <DEFAULT><HF>0</HF></DEFAULT>
</Offering>

我需要将上述XML格式更改为以下格式:请提供一些帮助,不胜感激...我已经尝试过下面的xslt,但它没有提供我希望您可以在尝试使用的xslt下方找到的输出和我得到的输出。

<Offering>
   <INFO>
    <REGION>R20</REGION>
  <PARISH>RCCGP1321000050</PARISH>
 <OPTION>WEEKLY</OPTION>
  <MONTH>May</MONTH>
  <YEAR>2019</YEAR>
  <WEEK>WK2</WEEK>
  <CURRENCY>NGN</CURRENCY>

  </INFO>
  <DEFAULT>
    <MinisterTithe>6870.60</MinisterTithe>
    <GeneralTithe>7780.00</GeneralTithe>
    <SundayLoveOffering>8860.00</SundayLoveOffering>
    <SundaySchool>770.00</SundaySchool></DEFAULT>
    <HappyOffering>4440.00</HappyOffering>
    <CRM>0.00</CRM>
    <HF>0</HF>
  </DEFAULT>
</Offering>

我尝试使用下面的xslt,但是它没有给我我想要的东西:

PS:下面的xslt就是这样

 <Offering>
  <!--RCCG PMS to eRemittance offering XML handshake-->
  <!--PARISH & OFFERING REMITTANCE INFO-->
  <REGION>R12</REGION>
  <PARISH>RCCGP1261000047</PARISH>
  <OPTION>WEEKLY</OPTION>
  <MONTH>Jun</MONTH>
  <YEAR>2019</YEAR>
  <WEEK>WK1</WEEK>
  <CURRENCY/>
  <!--DEFAULT OFFERING-->
  <MinisterTithe>0</MinisterTithe>
  <GeneralTithe>0</GeneralTithe>
  <SundayLoveOffering>0</SundayLoveOffering>
  <SundaySchool>0</SundaySchool>
  <HappyOffering>0</HappyOffering>
  <CRM>0</CRM>
  <HF>0</HF>
</Offering>

XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
   <xsl:output method="xml" omit-xml-declaration="yes" indent="no" />
 <xsl:template match="node()">
 <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>
  <xsl:template match="INFO|DEFAULT">

    <xsl:for-each select="node()">

      <xsl:element name="{name()}"><xsl:value-of select="."/> 
</xsl:element>

    </xsl:for-each>

  </xsl:template>

 </xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

您应该真正匹配Offering元素,并在该模板中进行分组。

假设您将永远只有INFODEFAULT元素,就可以做到这一点。...

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

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

  <xsl:template match="Offering">
    <xsl:copy>
      <INFO>
        <xsl:apply-templates select="INFO/node()" />
      </INFO>
      <DEFAULT>
        <xsl:apply-templates select="DEFAULT/node()" />
      </DEFAULT>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

如果要使其通用,并处理Offerings节点下的任何元素名称,则(在XSLT 1.0中)可以使用称为Muenchian Grouping的技术。

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

  <xsl:key name="Offerings" match="Offering/*" use="local-name()" />

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

  <xsl:template match="Offering">
    <xsl:copy>
      <xsl:for-each select="*[generate-id() = generate-id(key('Offerings', local-name())[1])]">
        <xsl:element name="{local-name()}">
          <xsl:apply-templates select="key('Offerings', local-name())/node()" />
        </xsl:element>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>