我正在编写一个XSLT 2.0脚本,它需要一个(设计不佳的)XML 输入文档,并且应该生成一个更易于处理的 XML 输出文档。
输入文档如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element>
<subelement id="1_1">1.1</subelement>
</element>
<element>
<subelement id="1_2">1.2</subelement>
</element>
<element>
<subelement id="1_foo">1.foo</subelement>
</element>
<element>
<subelement id="1_bar">1.bar</subelement>
</element>
<element>
<subelement id="2_1">2.1</subelement>
</element>
<element>
<subelement id="2_2">2.2</subelement>
</element>
<element>
<subelement id="2_foo">2.foo</subelement>
</element>
<element>
<subelement id="2_bar">2.bar</subelement>
</element>
</root>
有一些应用,以确定相关的子元素的商业逻辑:
取id
的subelement
和部分左下划线(的_
)是数据记录ID,而右边部分是id字段。
XSLT 过程所需的 XML 输出应如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<record id="1">
<field id="1">1.1</field>
<field id="2">1.2</field>
<field id="foo">1.foo</field>
<field id="bar">1.bar</field>
</record>
<record id="2">
<field id="1">2.1</field>
<field id="2">2.2</field>
<field id="foo">2.foo</field>
<field id="bar">2.bar</field>
</record>
</root>
这是一个非常基本的例子,但它说明了可以接受的任务。
重要提示:输入文档的顺序是随机的。
如果可能,转换应该在一个单一的转换中发生。
如何处理这个任务?
你可以试试这个: using for-each-group
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
<xsl:template match="root">
<xsl:copy>
<xsl:for-each-group select="element" group-by="substring-before(subelement/@id, '_')">
<record>
<xsl:for-each select="current-group()">
<field id="{substring-after(subelement/@id, '_')}">
<xsl:value-of select="normalize-space(.)"/>
</field>
</xsl:for-each>
</record>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句