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 回答