XSLT通过for-each-group和group-starting-with进行分组?

huangapple go评论76阅读模式
英文:

XSLT grouping via for-each-group and group-starting-with?

问题

我正在尝试为下面的示例创建分组。元素 'ques' 和紧随其后的兄弟元素 'p' 被放置在 'group' 元素内部。

输入的XML

<root>
    <title>Title</title>
    <p>para</p>
    <ques>Ques</ques>
    <p>aaaa</p>
    <fig>aaa</fig>
    <box>box</box>
    <ques>Ques</ques>
    <p>aaaa</p>
    <p>bbbb</p>
</root>

XSLT 代码

<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>

<xsl:template match="root">
    <xsl:copy>
        <xsl:for-each-group select="*" group-starting-with="ques">
            <group>
                <xsl:copy-of select="current-group()"/>
            </group>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

期望的输出

<root>
    <title>Title</title>
    <p>para</p>
    <group>
        <ques>Ques</ques>
        <p>aaaa</p>
    </group>
    <fig>aaa</fig>
    <box>box</box>
    <group>
        <ques>Ques</ques>
        <p>aaaa</p>
        <p>bbbb</p>
    </group>
</root>

链接: XSLT Fiddle

英文:

I'm trying to create group for below example. Element 'ques' and just following-sibling::p make inside the 'group' element<br/>
Input XML

&lt;root&gt;
&lt;title&gt;Title&lt;/title&gt;
&lt;p&gt;para&lt;/p&gt;
&lt;ques&gt;Ques&lt;/ques&gt;
&lt;p&gt;aaaa&lt;/p&gt;
&lt;fig&gt;aaa&lt;/fig&gt;
&lt;box&gt;box&lt;/box&gt;
&lt;ques&gt;Ques&lt;/ques&gt;
&lt;p&gt;aaaa&lt;/p&gt;
&lt;p&gt;bbbb&lt;/p&gt;
&lt;/root&gt;

XSLT Code:

&lt;xsl:output method=&quot;xml&quot; omit-xml-declaration=&quot;no&quot; indent=&quot;yes&quot;/&gt;

&lt;xsl:template match=&quot;root&quot;&gt;
    &lt;xsl:copy&gt;
        &lt;xsl:for-each-group select=&quot;*&quot; group-starting-with=&quot;ques&quot;&gt;
            &lt;group&gt;
                &lt;xsl:copy-of select=&quot;current-group()&quot;/&gt;
            &lt;/group&gt;
        &lt;/xsl:for-each-group&gt;
    &lt;/xsl:copy&gt;
&lt;/xsl:template&gt;

Expected Output:

&lt;root&gt;
  &lt;title&gt;Title&lt;/title&gt;
  &lt;p&gt;para&lt;/p&gt;
  &lt;group&gt;
    &lt;ques&gt;Ques&lt;/ques&gt;
    &lt;p&gt;para&lt;/p&gt;
  &lt;/group&gt;
  &lt;fig&gt;fig&lt;/fig&gt;
  &lt;box&gt;box&lt;/box&gt;
  &lt;group&gt;
    &lt;ques&gt;Ques&lt;/ques&gt;
    &lt;p&gt;para&lt;/p&gt;
    &lt;p&gt;para&lt;/p&gt;
  &lt;/group&gt;
&lt;/root&gt;

Link:
<https://xsltfiddle.liberty-development.net/6qVQdo6>

答案1

得分: 3

尝试可能是这样的:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/root">
    <xsl:copy>
        <xsl:for-each-group select="*" group-starting-with="ques">
            <xsl:for-each-group select="current-group()" group-adjacent="self::ques or self::p">	
                <xsl:choose>
                    <xsl:when test="self::ques">
                        <group>
                            <xsl:copy-of select="current-group()"/>
                        </group>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:copy-of select="current-group()"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>
  
</xsl:stylesheet>
英文:

Try perhaps something like:

XSLT 2.0

&lt;xsl:stylesheet version=&quot;2.0&quot; 
xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
&lt;xsl:output method=&quot;xml&quot; version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; indent=&quot;yes&quot;/&gt;

&lt;xsl:template match=&quot;/root&quot;&gt;
	&lt;xsl:copy&gt;
		&lt;xsl:for-each-group select=&quot;*&quot; group-starting-with=&quot;ques&quot;&gt;
			&lt;xsl:for-each-group select=&quot;current-group()&quot; group-adjacent=&quot;self::ques or self::p&quot;&gt;	
				&lt;xsl:choose&gt;
					&lt;xsl:when test=&quot;self::ques&quot;&gt;
						&lt;group&gt;
							&lt;xsl:copy-of select=&quot;current-group()&quot;/&gt;
						&lt;/group&gt;
					&lt;/xsl:when&gt;
					&lt;xsl:otherwise&gt;
						&lt;xsl:copy-of select=&quot;current-group()&quot;/&gt;
					&lt;/xsl:otherwise&gt;
				&lt;/xsl:choose&gt;
			&lt;/xsl:for-each-group&gt;
		&lt;/xsl:for-each-group&gt;
	&lt;/xsl:copy&gt;
&lt;/xsl:template&gt;
  
&lt;/xsl:stylesheet&gt;

huangapple
  • 本文由 发表于 2023年7月18日 00:24:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/76706415.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定