Вложенная группировка с использованием for-each-group - PullRequest
0 голосов
/ 17 февраля 2011

У меня есть следующий образец вложенного XML

<?xml version="1.0" encoding="UTF-8"?>
<text>
    <main>
        <div n="Section 1">
            <milestone unit="fragment"/>

            <div rend="header">
                <head>One</head>
            </div>
        </div>

        <div n="Section 2">
             <milestone unit="fragment"/>

              <div rend="header">
                <head>Two</head>
               </div>

            <div>
                <p>Para 1</p>
                <p>Para 2</p>
                <p>Para 3</p>

                <milestone unit="fragment"/>

                <p>Para 4</p>
                <p>Para 5</p>
                <p>Para 6</p>

                <milestone unit="fragment"/>

                <p>Para 7</p>
                <p>Para 8</p>
                <p>Para 9</p>

            </div>
        </div>
    </main>
</text>

Я пытаюсь сгруппировать его по фрагментам следующим образом:

 <div n="1">
         One
    </div>

    <div n="2">
         Two

         Para 1
         Para 2
         Para 3

    </div> 

    <div n="3">
         Para 4
         Para 5
         Para 6
    </div>

    <div n="4">
        Para 7
        Para 8
        Para 9
    </div>

Это XSLT, который я использую

<xsl:template match="/">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="text">
    <xsl:for-each select="main/div">
        <xsl:for-each-group select="*" group-starting-with="milestone[@unit='fragment']">
            <xsl:for-each select="current-group()" >
                <xsl:variable name="fragNum"><xsl:number count="milestone[@unit='fragment']" level="any" from="body"/></xsl:variable>
                <div n="{$fragNum}">
                    <xsl:apply-templates select="."/>    
                </div>
            </xsl:for-each>
        </xsl:for-each-group>
    </xsl:for-each>
</xsl:template>

Это результат преобразования:

  <div n=""/>
        <div n="">
            One
        </div>
        <div n=""/>
    <div n="">
        Two
    </div>
    <div n="">
        Para 1
        Para 2
        Para 3



        Para 4
        Para 5
        Para 6



        Para 7
        Para 8
        Para 9
    </div>

Несмотря на то, что я говорю для каждой группы, что группировка должна начинаться с "milestone [@ unit = 'фрагмент'], почему она игнорируется, когда тег вехи вложен в div?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

С таблицей стилей

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

  <xsl:output indent="yes"/>

  <xsl:template match="text">
    <xsl:for-each-group select="descendant::*[not(*)]"
      group-starting-with="milestone[@unit = 'fragment']">
      <div n="{position()}">
        <xsl:value-of select="current-group()" separator="&#10;"/>
      </div>
    </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

Saxon 9 выводит

<div n="1">
One</div>
<div n="2">
Two
Para 1
Para 2
Para 3</div>
<div n="3">
Para 4
Para 5
Para 6</div>
<div n="4">
Para 7
Para 8
Para 9</div>
0 голосов
/ 17 февраля 2011

Похоже, вы выбираете только дочерние элементы main/div в вашем for-each-group.Следовательно, (с точки зрения этого элемента for-each-group) нет элементов milestone, вложенных в следующий слой div.

...