首页 > 解决方案 > 转换 XML - 形成正确的记录

问题描述

我正在尝试创建一个 XSLT 来转换 XML 文档并且在识别记录边界时遇到了麻烦。下面是我的xml

<?xml version="1.0" encoding="UTF-8"?>
    <catalog>

       <mheader>
          <mid>1</mid>
          <mname>mn</mname>
       </mheader>
       <cheader>
          <cid>1</cid>
          <cname>cn</cname>
       </cheader>
       <lheader>
          <lid>1</lid>
          <lname>ln</lname>
       </lheader>
       <aheader>
          <aid>1</aid>
          <aname>an</aname>
       </aheader>
       <pos>
          <pid>1</pid>
          <pname>pay</pname>
       </pos>
       <pos>
          <pid>2</pid>
          <pname>pay1</pname>
       </pos>


       <mheader>
          <mid>2</mid>
          <mname>mh1</mname>
       </mheader>
       <cheader>
          <cid>2</cid>
          <cname>ch1</cname>
       </cheader>
       <lheader>
          <lid>2</lid>
          <lname>lh1</lname>
       </lheader>
       <aheader>
          <aid>2</aid>
          <aname>ah1</aname>
       </aheader>
       <pos>
          <pid>1</pid>
          <pname>pay</pname>
       </pos>
       <pos>
          <pid>2</pid>
          <pname>pay3</pname>
       </pos>
       <pos>
          <pid>3</pid>
          <pname>pay4</pname>
       </pos>
    </catalog>

我必须像下面那样转换我的 xml

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<record>
   <mheader>
      <mid>1</mid>
      <mname>mn</mname>
   </mheader>
   <cheader>
      <cid>1</cid>
      <cname>cn</cname>
   </cheader>
   <lheader>
      <lid>1</lid>
      <lname>ln</lname>
   </lheader>
   <aheader>
      <aid>1</aid>
      <aname>an</aname>
   </aheader>
   <pos>
      <pid>1</pid>
      <pname>pay</pname>
   </pos>
   <pos>
      <pid>2</pid>
      <pname>pay1</pname>
   </pos>
</record>
<record>
   <mheader>
      <mid>2</mid>
      <mname>mh1</mname>
   </mheader>
   <cheader>
      <cid>2</cid>
      <cname>ch1</cname>
   </cheader>
   <lheader>
      <lid>2</lid>
      <lname>lh1</lname>
   </lheader>
   <aheader>
      <aid>2</aid>
      <aname>ah1</aname>
   </aheader>
   <pos>
      <pid>1</pid>
      <pname>pay</pname>
   </pos>
   <pos>
      <pid>2</pid>
      <pname>pay3</pname>
   </pos>
   <pos>
      <pid>3</pid>
      <pname>pay4</pname>
   </pos>
</record>
</catalog>

理想情况下,一条记录应该从标签 mheader 开始,到最后一个 POS 标签结束。

这是我到目前为止所尝试的

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
 <record>
    <xsl:apply-templates select="catalog/mheader"/> 
    <xsl:apply-templates select="catalog/cheader"/> 
    <xsl:apply-templates select="catalog/lheader"/> 
    <xsl:apply-templates select="catalog/aheader"/>
    <xsl:apply-templates select="catalog/pos"/>
 </record>
</xsl:template>
</xsl:stylesheet>

在这种情况下如何在此处形成适当的记录有什么想法吗?

标签: xsltxslt-2.0

解决方案


 <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="catalog">
        <xsl:copy>
            <xsl:for-each-group select="*" group-starting-with="mheader">

                <Record>
                    <xsl:copy-of select="current-group()"/>
                </Record>

        </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
Check it.

推荐阅读