如何用XSLT实现XML标签的一对多关联组合?
解决XML中与同级配对生成独立的XSLT方案
嘿,这个需求其实很好实现,核心思路就是遍历每个原始<row>里的所有<pkz>标签,为每个<pkz>单独生成一个新的<row>节点,并把当前<row>对应的<number>标签一起放进去。我给你写了一段可用的XSLT脚本,直接就能用:
原始输入XML
<root> <row> <number>1</number> <pkz>aaa</pkz> <pkz>bbb</pkz> </row> <row> <number>2</number> <pkz>ccc</pkz> <pkz>aaa</pkz> <pkz>ddd</pkz> </row> <row> <number>3</number> <pkz>aaa</pkz> <pkz>yyy</pkz> </row> </root>
期望输出XML
<row> <number>1</number> <pkz>aaa</pkz> </row> <row> <number>1</number> <pkz>bbb</pkz> </row> <row> <number>2</number> <pkz>ccc</pkz> </row> <row> <number>2</number> <pkz>aaa</pkz> </row> <row> <number>2</number> <pkz>ddd</pkz> </row> <row> <number>3</number> <pkz>aaa</pkz> </row> <row> <number>3</number> <pkz>yyy</pkz> </row>
实现的XSLT脚本
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配根节点,启动处理流程 --> <xsl:template match="/root"> <!-- 遍历所有原始的<row>节点 --> <xsl:for-each select="row"> <!-- 保存当前<row>下的<number>节点,后续复用 --> <xsl:variable name="currentNumber" select="number"/> <!-- 遍历当前<row>里的每一个<pkz> --> <xsl:for-each select="pkz"> <!-- 生成新的<row>节点 --> <row> <!-- 复制对应的<number>节点 --> <xsl:copy-of select="$currentNumber"/> <!-- 复制当前遍历到的<pkz>节点 --> <xsl:copy-of select="."/> </row> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
脚本逻辑说明
- 先匹配根节点
<root>,进入处理流程; - 外层
for-each遍历所有原始<row>,每个原始<row>对应一组<number>和多个<pkz>; - 用变量
currentNumber保存当前<row>的<number>,避免重复查询; - 内层
for-each遍历当前<row>下的每个<pkz>,为每个<pkz>生成独立的新<row>; - 最后用
<xsl:copy-of>分别复制<number>和当前<pkz>到新<row>中,完成配对。
这个脚本兼容XSLT 1.0,几乎所有XML处理器都能运行,直接拿去用就好~
内容的提问来源于stack exchange,提问作者WAM
相关产品推荐
相关产品推荐

