使用XLST 1.0将平面XML转换为唯一的嵌套XML

茉莉花

我正在尝试将Filemaker数据库导出的输出转换为Web应用程序可以使用的形式。我尝试编写XLST(1.0)进行转换。Filemaker输出本质上是一个电子表格(行x列),我想根据关系对其进行转换。本质上,对于每个“ Col [1]”坦克,我都希望在与“ Col [3]”相关联的某个特定日期“ Col [2]”上收集数据。

使用XSLT,我已经能够获得唯一的日期或唯一的储罐,但是每个储罐没有多个日期。

我已经包括了我的XLST,以及输入XML的外观以及希望得到的东西的“简化”版本。

提前非常感谢您的任何建议!

到目前为止的XLST

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fmp="http://www.filemaker.com/fmpxmlresult" version="1.0" exclude-result-prefixes="fmp">
<xsl:output method="xml" version="1.0" encoding="windows-1251" indent="yes"/>

<xsl:key name="fishdate" match="fmp:ROW" use="fmp:COL[3]"/>
<xsl:key name="tanknumber" match="fmp:ROW" use="fmp:COL[9]"/>

<xsl:template match="/">
    <fishroom>
        <xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW[generate-id()=generate-id(key('tanknumber',fmp:COL[9]))]">

                <!-- <xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW[generate-id()=generate-id(key('fishdate',fmp:COL[3]))]"> -->
                        <date> <xsl:value-of select="fmp:COL[3]/fmp:DATA"/>
                            <tank> 
                                <temp><xsl:value-of select="fmp:COL[10]/fmp:DATA"/></temp>
                            </tank>
                        </date>
                 <!-- </xsl:for-each> -->
        </xsl:for-each>

    </fishroom>
</xsl:template>
</xsl:stylesheet>

输入XML:

<row>
    <col>1/1/14</col>
    <col>tank1</col>
    <col>data1</col
</row>
<row>
    <col>1/1/14</col>
    <col>tank2</col>
    <col>data3</col>
</row>
<row>
    <col>1/2/14</col>
    <col>tank1</col>
    <col>data2</col>
</row>

所需的输出:

<tank1>
    <date>1/1/14
         <somedata>data2</somedata>
    </date>
    <date>1/2/14
         <somedata>data1</somedata>
   </date>
</tank1>
<tank2>
     <date>1/2/14
         <somedata>data3</somedata>
      </date>
</tank2>
michael.hor257k

您的尝试有几个问题,最严重的是:

  1. 'fishdate'密钥必须使用的串联tankdate否则,您将把每个记录下的所有记录分组tank
  2. 分组后tank,您必须继续将当前组中的记录进行分组这些可以通过您用来确定不同坦克的相同钥匙来访问。
  3. 您省略了第三步,您实际上在其中列出了每个子组中的数据。

给定以下示例输入:

XML格式

<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
    <!-- omitted -->
    <RESULTSET FOUND="4">
        <ROW MODID="1" RECORDID="1">
            <COL><DATA>tank1</DATA></COL>
            <COL><DATA>1/1/2014</DATA></COL>
            <COL><DATA>data1</DATA></COL>
        </ROW>
        <ROW MODID="1" RECORDID="2">
            <COL><DATA>tank2</DATA></COL>
            <COL><DATA>1/1/2014</DATA></COL>
            <COL><DATA>data3</DATA></COL>
        </ROW>
        <ROW MODID="1" RECORDID="3">
            <COL><DATA>tank1</DATA></COL>
            <COL><DATA>1/2/2014</DATA></COL>
            <COL><DATA>data2</DATA></COL>
        </ROW>
        <ROW MODID="1" RECORDID="4">
            <COL><DATA>tank1</DATA></COL>
            <COL><DATA>1/1/2014</DATA></COL>
            <COL><DATA>data4</DATA></COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
exclude-result-prefixes="fmp">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="tanknumber" match="fmp:ROW" use="fmp:COL[1]"/>
<xsl:key name="fishdate" match="fmp:ROW" use="concat(fmp:COL[1], '|', fmp:COL[2])"/>

<xsl:template match="/">
    <fishroom>
        <!-- create a group for each distinct tank -->
        <xsl:for-each select="fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW[generate-id()=generate-id(key('tanknumber',fmp:COL[1]))]">
            <xsl:element name="{fmp:COL[1]/fmp:DATA}">
               <!-- create a subgroup for each distinct date within a tank -->
               <xsl:for-each select="key('tanknumber', fmp:COL[1])[generate-id()=generate-id(key('fishdate',concat(fmp:COL[1], '|', fmp:COL[2])))]"> 
                    <date>
                        <xsl:value-of select="fmp:COL[2]/fmp:DATA"/>
                        <!-- enumerate the values in the current subgroup -->
                         <xsl:for-each select="key('fishdate',concat(fmp:COL[1], '|', fmp:COL[2]))">
                             <value>
                                <xsl:value-of select="fmp:COL[3]/fmp:DATA"/>
                            </value>
                        </xsl:for-each>
                    </date>
                </xsl:for-each>
            </xsl:element>
        </xsl:for-each>
    </fishroom>
</xsl:template>

</xsl:stylesheet>

将返回此结果

<?xml version="1.0" encoding="UTF-8"?>
<fishroom>
   <tank1>
      <date>1/1/2014<value>data1</value>
         <value>data4</value>
      </date>
      <date>1/2/2014<value>data2</value>
      </date>
   </tank1>
   <tank2>
      <date>1/1/2014<value>data3</value>
      </date>
   </tank2>
</fishroom>

注意:
我不知道您的目标应用程序的要求是什么。上面输出的XML格式有两个缺点,通常可以避免以下两个缺点:

  1. 兄弟元素名称的顺序编号;
  2. 混合的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用XLST从xml文件中删除元素

来自分类Dev

使用XLST从XML文件中删除重复记录

来自分类Dev

如何使用Linq to XML将XML转换为嵌套词典?

来自分类Dev

如何使用Linq to XML将XML转换为嵌套词典?

来自分类Dev

XLST / XML:使用<xsl:for-each>将属性与WITHOUT比较时,拉出不同的节点

来自分类Dev

使用XSLT 1.0将平面XML表数据(其中元素由行和列名串联而成)转换为嵌套XML

来自分类Dev

如何使用 XSLT 1.0 将平面 XML 结构转换为分层 XML?

来自分类Dev

如何使用xslt将嵌套的Json对象转换为xml

来自分类Dev

使用XSLT 1将XML文档转换为base64

来自分类Dev

使用代码页1252将平面文件8859-1编码转换为OLE DB目标

来自分类Dev

XLST新行插入不能与Hive一起正常使用

来自分类Dev

XLST新行插入不能与Hive一起正常使用

来自分类Dev

使用XSLT将XML转换为XML

来自分类Dev

使用Scala收集方法可帮助将[0,0,0,1,1,1,1,0,0,1,1]的列表转换为[3,4,2,2]

来自分类Dev

使用每个唯一列的嵌套 json 将 csv 转换为 json

来自分类Dev

如何将嵌套的XML元素转换为平面XML

来自分类Dev

通过 XQuery 将嵌套的 XML 转换为平面 xml

来自分类Dev

使用 XSLT(使用嵌套循环)将 XML 文件转换为 CSV 文件

来自分类Dev

使用xlst计算中间元素

来自分类Dev

使用C#将内联XML节点转换为ASP.NET中的嵌套节点

来自分类Dev

使用Java将HTML转换为xml

来自分类Dev

使用xslt将xml转换为html

来自分类Dev

使用xsltproc将XML转换为CSV

来自分类Dev

使用PostgreSQL将XML转换为JSON

来自分类Dev

使用XSLT将XML转换为JSON

来自分类Dev

使用python将rdf转换为xml

来自分类Dev

使用Powershell将XML转换为JSON

来自分类Dev

使用PHP将JSON转换为XML

来自分类Dev

使用Jquery将XML转换为HTML

Related 相关文章

热门标签

归档