xslt - 转换 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>
在这种情况下如何在此处形成适当的记录有什么想法吗?
解决方案
<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.
推荐阅读
- asp.net - 重定向后禁用MVC缓存?
- ruby-on-rails - 为什么每当我登录我的 Rails 应用程序时,我都会在“id”列中收到“PG::NotNullViolation null 值违反非空约束”?
- python-3.x - ValueError:两个形状的维度 2 必须相等,但分别是 3 和 32
- .net - 有没有办法在 DOTNET AWS Lambda 的 MongoDB 连接中使用 TLS 1.2?
- excel - VBA在多个工作表中复制特定范围
- bash - 处理来自远程服务器的 PID 的 Bash 脚本
- sql - Laravel 计数和原始 sql 计数给出不同的值
- simulator - 为什么在 gem5 上运行 memtest.py 会出现 --cpu-type 参数错误?
- java - 具有字符数组功能的 Java for 循环
- ruby-on-rails - ubuntu 上的 ruby 2.5:最新错误资产:预编译