XSLT在保持顺序的同时将重复元素转换为一个元素

时间:2012-06-20 16:02:35

标签: xml xslt

我正在尝试使用样式表来转换某些XML,它看起来像:

     <m10:RESPONSE_DETAIL> 
        <m10:LINE_NO>001</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>00000109</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>00000009</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
     </m10:RESPONSE_DETAIL> 
     <m10:RESPONSE_DETAIL> 
        <m10:LINE_NO>002</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>00000109</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>00000009</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
     </m10:RESPONSE_DETAIL> 
     <m10:RESPONSE_DETAIL> 
        <m10:LINE_NO>003</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>00000100</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>00000000</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
     </m10:RESPONSE_DETAIL> 

进入这个:

     <m10:RESPONSE_DETAIL> 
        <m10:LINE_NO>001</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>109</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>9</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
        <m10:LINE_NO>002</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>109</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>9</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
        <m10:LINE_NO>003</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>100</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>0</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
     </m10:RESPONSE_DETAIL>

我在xslt中不是太强大所以这可能是一个基本的但我到目前为止所尝试的一切都回来了:

     <m10:RESPONSE_DETAIL> 
        <m10:LINE_NO>001</m10:LINE_NO> 
        <m10:LINE_NO>002</m10:LINE_NO> 
        <m10:LINE_NO>003</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>109</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_AMT>109</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_AMT>100</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>9</m10:APPR_ITEM_TAX> 
        <m10:APPR_ITEM_TAX>9</m10:APPR_ITEM_TAX> 
        <m10:APPR_ITEM_TAX>0</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
     </m10:RESPONSE_DETAIL> 

任何建议都会受到赞赏......

提前谢谢

2 个答案:

答案 0 :(得分:0)

您发布的示例不是有效的Xml文档 - 您要转换的文档具有多个根元素,并且都不显示绑定到的命名空间m10前缀。

您可以使用身份转换来实现您想要的效果。我修改了你的输入文档,以便可以编写一个xslt。我的输入文档如下所示:

<root xmlns:m10="m10">
     <m10:RESPONSE_DETAIL>  
        <m10:LINE_NO>001</m10:LINE_NO>  
        <m10:APPR_ITEM_AMT>00000109</m10:APPR_ITEM_AMT>  
        <m10:APPR_ITEM_TAX>00000009</m10:APPR_ITEM_TAX>  
        <m10:TAX_FLAG>N</m10:TAX_FLAG>  
     </m10:RESPONSE_DETAIL>  
     <m10:RESPONSE_DETAIL>  
        <m10:LINE_NO>002</m10:LINE_NO>  
        <m10:APPR_ITEM_AMT>00000109</m10:APPR_ITEM_AMT>  
        <m10:APPR_ITEM_TAX>00000009</m10:APPR_ITEM_TAX>  
        <m10:TAX_FLAG>N</m10:TAX_FLAG>  
     </m10:RESPONSE_DETAIL>  
     <m10:RESPONSE_DETAIL>  
        <m10:LINE_NO>003</m10:LINE_NO>  
        <m10:APPR_ITEM_AMT>00000100</m10:APPR_ITEM_AMT>  
        <m10:APPR_ITEM_TAX>00000000</m10:APPR_ITEM_TAX>  
        <m10:TAX_FLAG>N</m10:TAX_FLAG>  
     </m10:RESPONSE_DETAIL>
</root>

我创建了以下样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:m10="m10">
    <xsl:output method="xml" indent="yes"/>


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

  <xsl:template match="root">
    <m10:RESPONSE_DETAIL>
      <xsl:apply-templates />
    </m10:RESPONSE_DETAIL>
  </xsl:template>

  <xsl:template match="m10:RESPONSE_DETAIL">
    <xsl:apply-templates select="*"/>
  </xsl:template>
</xsl:stylesheet>

将您的输入文档转换为:

<?xml version="1.0" encoding="utf-8"?>
<m10:RESPONSE_DETAIL xmlns:m10="m10" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
     <m10:LINE_NO>001</m10:LINE_NO><m10:APPR_ITEM_AMT>00000109</m10:APPR_ITEM_AMT><m10:APPR_ITEM_TAX>00000009</m10:APPR_ITEM_TAX><m10:TAX_FLAG>N</m10:TAX_FLAG>  
     <m10:LINE_NO>002</m10:LINE_NO><m10:APPR_ITEM_AMT>00000109</m10:APPR_ITEM_AMT><m10:APPR_ITEM_TAX>00000009</m10:APPR_ITEM_TAX><m10:TAX_FLAG>N</m10:TAX_FLAG>  
     <m10:LINE_NO>003</m10:LINE_NO><m10:APPR_ITEM_AMT>00000100</m10:APPR_ITEM_AMT><m10:APPR_ITEM_TAX>00000000</m10:APPR_ITEM_TAX><m10:TAX_FLAG>N</m10:TAX_FLAG>
</m10:RESPONSE_DETAIL>

答案 1 :(得分:0)

这个XSLT 1.0样式表...

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:m10="m10">
<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="m10:RESPONSE_DETAIL[1]">
  <xsl:copy>
   <xsl:apply-templates select="@*" /> 
   <xsl:apply-templates select="../m10:RESPONSE_DETAIL/*" /> 
  </xsl:copy>    
</xsl:template>

<xsl:template match="m10:RESPONSE_DETAIL" />

</xsl:stylesheet>

...将转换此输入文档

<root xmlns:m10="m10" > 
<m10:RESPONSE_DETAIL> 
        <m10:LINE_NO>001</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>00000109</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>00000009</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
     </m10:RESPONSE_DETAIL> 
     <m10:RESPONSE_DETAIL> 
        <m10:LINE_NO>002</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>00000109</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>00000009</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
     </m10:RESPONSE_DETAIL> 
     <m10:RESPONSE_DETAIL> 
        <m10:LINE_NO>003</m10:LINE_NO> 
        <m10:APPR_ITEM_AMT>00000100</m10:APPR_ITEM_AMT> 
        <m10:APPR_ITEM_TAX>00000000</m10:APPR_ITEM_TAX> 
        <m10:TAX_FLAG>N</m10:TAX_FLAG> 
</m10:RESPONSE_DETAIL>
</root>

根据需要。