首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XSLT将XML嵌套到平面XML

使用XSLT将XML嵌套到平面XML
EN

Stack Overflow用户
提问于 2015-12-01 20:00:52
回答 1查看 708关注 0票数 0

我正在尝试将嵌套的XML结构转换为平面XML,使用的是xslt中的for--每个都很困难:(下面是我的源和目标,因此非常感谢使用XSLT的任何输入。

源XML

代码语言:javascript
复制
<LS>    
<dlu fD="2012-06-07" tD="2012-06-13">
        <ULUI uid="uid-1" fAD="2012-06-11" lAD="2012-06-11">
          <LU license="License1" count="1"/>
        </ULUI>
        <ULUI uid="uid-2" fAD="2012-06-10" lAD="2012-06-10">
          <LU license="License1" count="1"/>
        </ULUI>
        <ULUI uid="uid-3" fAD="2012-06-09" lAD="2012-06-09">
          <LU license="License1" count="1"/>
        </ULUI>
        <ULUI uid="uid-4" fAD="2012-06-07" lAD="2012-06-08">
          <LU license="License3" count="1"/>
          <LU license="License4" count="1"/>
        </ULUI>
        <ULUI uid="uid-5" fAD="2012-06-07" lAD="2012-06-08">
          <LU license="License1" count="1"/>
          <LU license="License5" count="1"/>
        </ULUI>
      </dlu>
      <dlu fD="2012-06-14" tD="2012-06-20">
        <ULUI uid="uid-1" fAD="2012-06-14" lAD="2012-06-14">
          <LU license="License1" count="1"/>
        </ULUI>
        <ULUI uid="uid-2" fAD="2012-06-15" lAD="2012-06-20">
          <LU license="License2" count="1"/>
          <LU license="License4" count="1"/>
        </ULUI>
        <ULUI uid="uid-3" fAD="2012-06-16" lAD="2012-06-19">
          <LU license="License1" count="1"/>
          <LU license="License5" count="1"/>
        </ULUI>
        <ULUI uid="uid-4" fAD="2012-06-17" lAD="2012-06-18">
          <LU license="License1" count="1"/>
          <LU license="License3" count="1"/>
        </ULUI>
        <ULUI uid="uid-5" fAD="2012-06-17" lAD="2012-06-18">
          <LU license="License7" count="1"/>
          <LU license="License9" count="1"/>
        </ULUI>
    </dlu>
</LS>

目标XML

代码语言:javascript
复制
<FDLU>
<LU>
<LD_FR_DT>2012-06-07</LD_FR_DT
<LD_TO_DT>2012-06-13</LD_TO_DT>
<LU_UID>uid-1</LU_UID>  
<LU_FA_DT>2012-06-11</LU_FA_DT>
<LU_LA_DT>2012-06-11</LU_LA_DT>
<LU_LICENSE>License1</LU_LICENSE>
<LU_COUNT>1</LU_COUNT>
</LU>
<LU>
<LD_FR_DT>2012-06-07</LD_FR_DT
<LD_TO_DT>2012-06-13</LD_TO_DT>
<LU_UID>uid-2</LU_UID>  
<LU_FA_DT>2012-06-10</LU_FA_DT>
<LU_LA_DT>2012-06-10</LU_LA_DT>
<LU_LICENSE>License1</LU_LICENSE>
<LU_COUNT>1</LU_COUNT>
</LU>
<LU>
<LD_FR_DT>2012-06-07</LD_FR_DT
<LD_TO_DT>2012-06-13</LD_TO_DT>
<LU_UID>uid-4</LU_UID>  
<LU_FA_DT>2012-06-07</LU_FA_DT>
<LU_LA_DT>2012-06-08</LU_LA_DT>
<LU_LICENSE>License3</LU_LICENSE>
<LU_COUNT>1</LU_COUNT>
</LU>
<LU>
<LD_FR_DT>2012-06-07</LD_FR_DT
<LD_TO_DT>2012-06-13</LD_TO_DT>
<LU_UID>uid-4</LU_UID>  
<LU_FA_DT>2012-06-07</LU_FA_DT>
<LU_LA_DT>2012-06-08</LU_LA_DT>
<LU_LICENSE>License4</LU_LICENSE>
<LU_COUNT>1</LU_COUNT>
</LU>
<LU>
<LD_FR_DT>2012-06-07</LD_FR_DT
<LD_TO_DT>2012-06-13</LD_TO_DT>
<LU_UID>uid-5</LU_UID>  
<LU_FA_DT>2012-06-07</LU_FA_DT>
<LU_LA_DT>2012-06-08</LU_LA_DT>
<LU_LICENSE>License1</LU_LICENSE>
<LU_COUNT>1</LU_COUNT>
</LU>
<LU>
<LD_FR_DT>2012-06-07</LD_FR_DT
<LD_TO_DT>2012-06-13</LD_TO_DT>
<LU_UID>uid-5</LU_UID>  
<LU_FA_DT>2012-06-07</LU_FA_DT>
<LU_LA_DT>2012-06-08</LU_LA_DT>
<LU_LICENSE>License5</LU_LICENSE>
<LU_COUNT>1</LU_COUNT>
</LU>
<LD_FR_DT>2012-06-14</LD_FR_DT
<LD_TO_DT>2012-06-20</LD_TO_DT>
<LU_UID>uid-1</LU_UID>  
<LU_FA_DT>2012-06-14</LU_FA_DT>
<LU_LA_DT>2012-06-14</LU_LA_DT>
<LU_LICENSE>License1</LU_LICENSE>
<LU_COUNT>1</LU_COUNT>
</LU>
.....
</FDLU>

因此,基本上,我需要一个平面行每个LU从源,但我的ULUI和DLU也是无界的,以便他们可以出现不止一次。我正在寻找XSLT1.0或2.0版本的解决方案。我从for -每个LU开始,然后尝试继续,但是我无法处理ULUI和DLU的多个事件,它们的值只是在一行中结束。

我的努力正在进行中

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
     <xsl:variable name="srcDoc1" select="bpws:getVariableData('XMLVar')"/>
   <xsl:template match="/">
      <xsl:element name="FDLU" namespace="">
<!--         <xsl:for-each select="$srcDoc1/LS/DLU"> -->
<!--            <xsl:for-each select="/DLU/ULUI"> -->
                <xsl:for-each select="$srcDoc1/LS/DLU/ULUI/LU">
                       <xsl:element name="LD_FR_DT" namespace="">
                            <xsl:value-of select="$srcDoc1/LS/DLU/@fD"/>
                         </xsl:element>
                       <xsl:element name="LD_TO_DT" namespace="">
                            <xsl:value-of select="$srcDoc1/LS/DLU/@tD"/>
                         </xsl:element>
                       <xsl:element name="LU_UID" namespace="">
                            <xsl:value-of select="$srcDoc1/LS/DLU/ULUI/@uid"/>
                         </xsl:element>
                       <xsl:element name="LU_FA_DT" namespace="">
                            <xsl:value-of select="$srcDoc1/LS/DLU/ULUI/@fAD"/>
                         </xsl:element>
                       <xsl:element name="LU_LA_DT" namespace="">
                            <xsl:value-of select="$srcDoc1/LS/DLU/ULUI/@lAD"/>
                         </xsl:element>
                       <xsl:element name="LU_LICENSE" namespace="">
                            <xsl:value-of select="@license"/>
                         </xsl:element>
                       <xsl:element name="LU_COUNT" namespace="">
                            <xsl:value-of select="@count"/>
                         </xsl:element>
                      </xsl:element>
<!--                    </xsl:for-each> -->
<!--              </xsl:for-each> -->
           </xsl:for-each>
        </xsl:element>
     </xsl:template>
  </xsl:stylesheet>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-01 20:17:33

我想这是正确的地图..。使用applytemplates也可以很容易地做到这一点。

注意:您的示例XML是一个片段,因此我用外部元素包装它以进行测试。

代码语言:javascript
复制
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <FDUL>
      <xsl:for-each select="//LU">
        <LU>
          <LD_FR_DT>
            <xsl:value-of select="../../@fD"/>
          </LD_FR_DT>
          <LD_TO_DT>
            <xsl:value-of select="../../@tD"/>
          </LD_TO_DT>
          <LU_UID>
            <xsl:value-of select="../@uid"/>
          </LU_UID>
          <LU_FA_DT>
            <xsl:value-of select="../@fAD"/>
          </LU_FA_DT>
          <LU_LA_DT>
            <xsl:value-of select="../@lAD"/>
          </LU_LA_DT>
          <LU_LICENSE>
            <xsl:value-of select="@license"/>
          </LU_LICENSE>
          <LU_COUNT>
            <xsl:value-of select="@count"/>
          </LU_COUNT>
        </LU>
      </xsl:for-each>
    </FDUL>
  </xsl:template>
</xsl:stylesheet>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34029069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档