Разбиение узлов на страницы в XSLT - PullRequest
2 голосов
/ 14 сентября 2010

Мой формат xml приведен ниже,

<SAMPLEFORM>
    <SAMPLE ID='1' TYPE='Normal'>
        <DATA>1</DATA>
    </SAMPLE>
    <SAMPLE TYPE='PageSplitter'>
        <DATA>N/A</DATA>
    </SAMPLE>
    <SAMPLE ID='2' TYPE='Normal'>
        <DATA>1</DATA>
    </SAMPLE>
</SAMPLEFORM>

Я пытаюсь разбить узлы на наборы, которые содержат атрибут Type='Normal' путем определения начальной позиции.Конечная позиция набора узлов будет следующим вхождением узла, который содержит атрибут Type='PageSplitter'.

Есть ли способ получить позицию узла, не проходя цикл for-each?И как это сделать выше?

1 Ответ

1 голос
/ 14 сентября 2010

Вам не нужны два вида маркеров - достаточно одного :

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="kPage" match="SAMPLE[not(@TYPE='Normal')]"
         use="generate-id(preceding-sibling::SAMPLE[@TYPE='Normal'][1])"/>

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

 <xsl:template match="SAMPLE[@TYPE='Normal']">
   <page>
     <xsl:copy-of select=".|key('kPage', generate-id())"/>
   </page>
 </xsl:template>

 <xsl:template match="SAMPLE[not(@TYPE='Normal')]"/>
</xsl:stylesheet>

, когда это преобразование применяется к следующему XML (предоставленному, сделанный правильно, с добавлением еще одного элемента и без "PAGESPLITTER") :

<SAMPLEFORM>
    <SAMPLE ID='1' TYPE='Normal'>
        <DATA>1</DATA>
    </SAMPLE>
    <SAMPLE ID='2'>
        <DATA>2</DATA>
    </SAMPLE>
    <SAMPLE ID='3' TYPE='Normal'>
        <DATA>3</DATA>
    </SAMPLE>
</SAMPLEFORM>

желаемый, правильный результат получается :

<SAMPLEFORM>
    <page>
        <SAMPLE ID="1" TYPE="Normal">
            <DATA>1</DATA>
        </SAMPLE>
        <SAMPLE ID="2">
            <DATA>2</DATA>
        </SAMPLE>
    </page>
    <page>
        <SAMPLE ID="3" TYPE="Normal">
            <DATA>3</DATA>
        </SAMPLE>
    </page>
</SAMPLEFORM>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...