我的XML文件看起来像
<templates>
<template type="ORC">
<field/>
</template>
<template type="OBR">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="SPM">
<field/>
</template>
<template type="ORC">
<field/>
</template>
<template type="OBR">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="SPM">
<field/>
</template>
</templates>
我想将订单详细信息(template / @ type ='ORC')分组,并使用XSLT 2.0将上面的示例XML转换为以下格式
<templates>
<order-details>
<template type="ORC">
<field/>
</template>
<template type="OBR">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="SPM">
<field/>
</template>
</order-details>
<order-details>
<template type="ORC">
<field/>
</template>
<template type="OBR">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="SPM">
<field/>
</template>
</order-details>
</templates>
答案 0 :(得分:2)
您可以使用xsl:for-each-group
的group-starting-with
属性按照您想要的方式进行分组。
下面:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="templates">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each-group select="template"
group-starting-with="*[@type='ORC']">
<order-details>
<xsl:apply-templates select="current-group()"/>
</order-details>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当应用于输入文档时,会产生您指定的预期输出:
<templates>
<order-details>
<template type="ORC">
<field/>
</template>
<template type="OBR">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="SPM">
<field/>
</template>
</order-details>
<order-details>
<template type="ORC">
<field/>
</template>
<template type="OBR">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="OBX">
<field/>
</template>
<template type="SPM">
<field/>
</template>
</order-details>
</templates>