1

我有以下 xml (为此目的进行了简化)

<content>
<p1>blabla</p1>
<p2>blabla</p2>
<p2>blabla</p2>
<p1>blabla</p1>
<p3>blabla</p3>
<p1>blabla</p1>
<p2>blabla</p2>
<p2>blabla</p2>
<p1>blabla</p1>
<p3>blabla</p3>
<p2>blabla</p2>
</content>

我想对所有 p1 元素和 p2 元素进行分组,但只有在前一个兄弟元素是 p1 元素的情况下才会对后者进行分组。

我使用了以下 xslt :

<xsl:for-each-group select="*" group-adjacent="self::p1 or (self::p2 and preceding-sibling::p1[1])">
                    <xsl:choose>
                        <xsl:when test="current-grouping-key()">
                            <ol_coll>
                                <xsl:apply-templates select="current-group()"/>

                            </ol_coll>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:apply-templates select="current-group()"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each-group>

但是我忽略了语法中的某些内容,因为它不查看前一个元素,而是查看整个树。所以我得到以下回报

<content>
<ol_coll>
    <p1>blabla</p1>
    <p2>blabla</p2>
    <p2>blabla</p2>
    <p1>blabla</p1>
</ol_coll>
<p3>blabla</p3>
<ol_coll>
    <p1>blabla</p1>
    <p2>blabla</p2>
    <p2>blabla</p2>
    <p1>blabla</p1>
</ol_coll>
<p3>blabla</p3>
<ol_coll>
    <p2>blabla</p2>
</ol_coll>
  </content>

但我希望的是以下内容:

<content>
<ol_coll>
    <p1>blabla</p1>
    <p2>blabla</p2>
</ol_coll>
<p2>blabla</p2>
<p1>blabla</p1>
<p3>blabla</p3>
<ol_coll>
    <p1>blabla</p1>
    <p2>blabla</p2>
</ol_coll>
<p2>blabla</p2>
<p1>blabla</p1>
<p3>blabla</p3>
<p2>blabla</p2>
 </content>

谁能指出我的错误?谢谢 !

4

1 回答 1

2

我认为您需要将条件更改为preceding-sibling::*[1][self::p1],然后您需要确保不包装单个元素。所以随着

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="content">
  <xsl:copy>
             <xsl:for-each-group select="*" group-adjacent="self::p1 or (self::p2 and preceding-sibling::*[1][self::p1])">
                    <xsl:choose>
                        <xsl:when test="current-grouping-key() and current-group()[2]">
                            <ol_coll>
                                <xsl:apply-templates select="current-group()"/>

                            </ol_coll>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:apply-templates select="current-group()"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each-group>  
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

我得到了你发布的结果(运行 Saxon 9.4)。

于 2013-03-14T12:02:31.420 回答