xml – 在XSLT中递归组合相同的兄弟元素
如何使用XSLT将具有相同名称和相同属性的所有同级元素合并到单个元素中?转换也应递归地应用于正在合并的元素的子元素.这是源文件:
<?xml version="1.0"?> <Root> <Element id="UniqueId1"> <SubElement1/> <SubElement2> <LeafElement1/> </SubElement2> </Element> <Element id="UniqueId1"> <SubElement2> <LeafElement1/> <LeafElement2/> </SubElement2> <SubElement3/> </Element> <Element id="UniqueId2"> <SubElement1/> <SubElement4/> </Element> </Root> 它应该转变为: <?xml version="1.0"?> <Root> <Element id="UniqueId1"> <SubElement1/> <SubElement2> <LeafElement1/> <LeafElement2/> </SubElement2> <SubElement3/> </Element> <Element id="UniqueId2"> <SubElement1/> <SubElement4/> </Element> </Root> 具有相同名称和属性的任何元素都合并为一个元素.然后,他们的孩子接受检查.如果其中任何一个具有相同的名称和相同的属性,则将它们组合在一起.此转换以递归方式应用于所有元素. 编辑:为了澄清,所有这些条件必须为两个要合并的元素. >它们具有相同的元素名称 这些元素是相同的,应该合并: >< Item />和< Item /> (同名,相同属性) 这些元素不相同,不应合并: >< Item />和< SubItem /> (不同的名字)
这应该做的工作:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" indent="yes"/> <xsl:key name="atts-by-name" match="@*" use="name()"/> <xsl:template match="Root"> <xsl:copy> <xsl:call-template name="merge"> <xsl:with-param name="elements" select="*"/> </xsl:call-template> </xsl:copy> </xsl:template> <xsl:template name="merge"> <xsl:param name="elements"/> <xsl:for-each select="$elements"> <xsl:variable name="same-elements" select="$elements[name()=name(current()) and count(@*)=count(current()/@*) and count(@*[. = key('atts-by-name',name())[generate-id(..)=generate-id(current())]])=count(@*)]"/> <xsl:if test="generate-id($same-elements[1]) = generate-id()"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:call-template name="merge"> <xsl:with-param name="elements" select="$same-elements/*"/> </xsl:call-template> </xsl:copy> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet> 棘手的部分是相同元素的定义;按名称索引属性对于验证所有属性的真实性是必需的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 设计,允许用户更改密码
- oracle12c安装报错:PRVF-0002的解决方法
- JSON.parse()和JSON.stringify()
- objective-c – 在请求ASIHTTPRequest或AFNetwor
- ruby-on-rails – 由upvotes排序的acts_as_votab
- PostgreSQL – 在函数中启动一个事务块
- cocos2d-x ----内存优化
- ruby-on-rails – 用于Rails 3的cache_money
- 3D引擎:Horde3D:Cocos 和 Horde3D渲染部分的设
- PostgreSQL:提高pg_dump,pg_restore性能