首页 > 解决方案 > 将一种 XML 格式转换为另一种

问题描述

我有这个 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>

标签: xmlxslt

解决方案


你真的应该匹配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>

推荐阅读