2010-09-14 2 views
2

Мой формат XML приведен ниже,Ломая узлы на страницы в XSLT

<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? И как это сделать?

+0

Можете ли вы опубликовать образец ожидаемого результата? – Oded

+0

Ну выход визуализируется в HTML, я предполагаю, что это может быть что-то подобное, Следующая страница – sam123

+0

Если вы преобразовать в HTML, что вы имеете в виду под «Следующая страница»? Пожалуйста, укажите пример вывода в исходном вопросе, а также, если вы можете использовать XSLT 2.0. –

ответ

1

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

<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> 
+0

+1 хорошее решение! Я думаю, вы можете отредактировать свой неверный результат ... Ja! –

+0

@Alejandro: Спасибо, что заметили это - исправлено форматирование. –

Смежные вопросы