xml - 将一种 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>
解决方案
你真的应该匹配Offering
元素,并在该模板中进行分组。
假设,你将永远只有INFO
和DEFAULT
元素,你可以做到这一点....
<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>
推荐阅读
- three.js - Forge 查看器:如何在材质中禁用透明度
- c# - 虚拟路径问题
- r - 按特定日期访问 data.frame 子集会生成 NA
- jupyter-notebook - 如何从 Jupyter Notebook 制作精美的 PDF?
- xamarin - NSDictionary 到 Xamarin.iOS 中的 Json
- multithreading - C# 4.0 中的异步函数调用
- ssis - 如何修复“[OData Source [56]] 错误:无法从运行时连接管理器获取托管连接。” SSIS中的错误?
- laravel - Laravel - 队列作业不被重用?
- google-app-engine - 有没有办法在 Google App Engine 中查找实例的生成时间和其他详细信息?
- containers - 无服务器容器和具有自定义运行时灵活的 App Engine 之间有什么区别?