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 に答える