我有以下xml:
<note>
<para>customer name :</para>
<para>mr. Joe Someone</para>
<para>calling from :</para>
<para>1234567</para>
<para>device model :</para>
<para>ABC-123</para>
<para>issue:</para>
<para>some info</para>
<para>some more info</para>
<para>and even more info</para>
<para>solution :</para>
<para>some solutions</para>
<para>and some more solutions</para>
</note>
我想在文本以doubledot结尾的每个节点上进行分组,结果将如下所示:
<note>
<para>customer name :</para>
<groupdata>
<para>mr. Joe Someone</para>
</groupdata>
<para>calling from :</para>
<groupdata>
<para>1234567</para>
</groupdata>
<para>device model :</para>
<groupdata>
<para>ABC-123</para>
</groupdata>
<para>issue:</para>
<groupdata>
<para>some info</para>
<para>some more info</para>
<para>and even more info</para>
</groupdata>
<para>solution :</para>
<groupdata>
<para>some solutions</para>
<para>and some more solutions</para>
</groupdata>
</note>
最有效的方法是什么(使用xslt 2.0)?
答案 0 :(得分:1)
我认为使用xsl:for-each-group select="*" group-starting-with="*[ends-with(., ':')]"
是直截了当的:
<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 indent="yes"/>
<xsl:template match="note">
<xsl:copy>
<xsl:for-each-group select="*" group-starting-with="*[ends-with(., ':')]">
<xsl:copy-of select="."/>
<groupdata>
<xsl:copy-of select="current-group() except ."/>
</groupdata>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
每次实施都需要衡量效率。