3

入力 XML:

<entry>
    <text>
        <p>xyz</p>
        <p>xyz</p>
        <p>xyz</p>
        <p>xyz</p>
        <author>abc</author>
        <p>xyz</p>
        <p>xyz</p>
        <p>xyz</p>
        <author>abc</author>
    </text>
</entry>

XSLT 1.0 を使用しています。

<p>次の要素まですべての要素を選択<author>し、それらを (次の要素と一緒に<author>) 新しい要素の下にグループ化したいと思います<div>。したがって、期待される出力は次のようになります。

<entry>
    <text>
      <div>
        <p>xyz</p>
        <p>xyz</p>
        <p>xyz</p>
        <p>xyz</p>
        <author>abc</author>
      </div>
      <div>
        <p>xyz</p>
        <p>xyz</p>
        <p>xyz</p>
        <author>abc</author>
      </div>
    </text>
</entry>

私はこの解決策を試しました:

<xsl:template match="entry">
    <entry>
       <text>
         <div>
           <xsl:apply-templates select="child::node()[not(preceding-sibling::author)]"/>
         </div>
       </text>
    </entry>
</xsl:template>

<p>+の最初のグループではうまくいきますが、次のグループではうまくいき<author>ません。

助けていただければ幸いです。

4

1 に答える 1

0

著者の前のすべての要素をグループ化できます (preceding-sibling:*これは著者ではなく ( name() != 'author')、現在の著者を次の著者として持つことができます ( generate-id( following-sibling::author[1]) = generate-id(current())):

preceding-sibling::*[ name() != 'author' and
   generate-id( following-sibling::author[1]) = generate-id(current()) ]

次のようなことを試してください:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*" />
    <xsl:output method="xml" indent="yes"/>


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

    <xsl:template match="text">
        <xsl:copy>
            <xsl:apply-templates select="author" mode="adddiv"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="author" mode="adddiv" >
        <!-- preceding siblings not  author   -->
        <xsl:variable name="fs" select="preceding-sibling::*[ name() != 'author' and
                                             generate-id( following-sibling::author[1]
                                          ) = generate-id(current()) ]" />

        <div >
            <xsl:apply-templates select="$fs | ." />
        </div>
    </xsl:template>
</xsl:stylesheet>

次の出力が生成されます。

<entry>
  <text>
    <div>
      <p>xyz</p>
      <p>xyz</p>
      <p>xyz</p>
      <p>xyz</p>
      <author>abc</author>
    </div>
    <div>
      <p>xyz</p>
      <p>xyz</p>
      <p>xyz</p>
      <author>abc</author>
    </div>
  </text>
</entry>
于 2013-06-14T10:34:39.493 に答える