2015-08-18 3 views
0

Используя XSL 1.0, я пытаюсь получить данные между двумя элементами «Раздел». Мне не составит труда получить только информацию «Заголовок», но я также хотел бы знать, какая Секция находится между ними, поскольку они не являются братьями и сестрами. Вот где я напортачиваюсь.XSL-группирование по разделам

Я искал в Интернете и этот форум различные решения, в основном пытаясь сгенерировать ключ и используя группировку, но мне не удалось получить что-либо, что работает. Иногда это ошибка «ожидаемого пробела» или вообще ничего.

ВХОД:

<Root> 
    <Content> 
    <Paragraph Type="New Section"> 
     <Text>Section A</Text> 
    </Paragraph> 
    <Paragraph Type="Stuff"> 
     <Text>Random information 1</Text> 
    </Paragraph> 
    <Paragraph Type="Heading"> 
     <Text>Important information 1</Text> 
    </Paragraph> 
    <Paragraph Type="Stuff"> 
     <Text>Random information 2</Text> 
    </Paragraph> 
    <Paragraph Type="Heading"> 
     <Text>Important information 2</Text> 
    </Paragraph> 
    <Paragraph Type="End Of Section"> 
     <Text>End of Section A</Text> 
    </Paragraph> 
    <Paragraph Type="New Section"> 
     <Text>Section B</Text> 
    </Paragraph> 
    <Paragraph Type="Stuff"> 
     <Text>Random information 3</Text> 
    </Paragraph> 
    <Paragraph Type="Heading"> 
     <Text>Important information 3</Text> 
    </Paragraph> 
    <Paragraph Type="Stuff"> 
     <Text>Random information 4</Text> 
    </Paragraph> 
    <Paragraph Type="Heading"> 
     <Text>Important information 4</Text> 
    </Paragraph> 
    <Paragraph Type="End Of Section"> 
     <Text>End of Section B</Text> 
    </Paragraph> 
    </Content> 
</Root> 

DESIRED ВЫВОД:

"Important information 1" 
"Section A" 
"Important information 2" 
"Section A" 
"Important information 3" 
"Section B" 
"Important information 4" 
"Section B" 

Как я уже говорил, с помощью выбрать и когда = "Заголовок" тест против пункта/@ Тип Умею получите текст «Важная информация», но я не могу понять, как рассказать, между какими разделами они падают.

Заранее спасибо.

ответ

1

Я не могу понять, как рассказать, между разделами они падают.

Если пересчитать эту проблему, как «какой раздел был последним в начала до текущего заголовка», то она становится довольно тривиальным:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:template match="/Root"> 
    <xsl:for-each select="Content/Paragraph[@Type='Heading']"> 
     <xsl:value-of select="Text"/> 
     <xsl:text>&#10;</xsl:text> 
     <xsl:value-of select="preceding-sibling::Paragraph[@Type='New Section'][1]/Text"/> 
     <xsl:text>&#10;</xsl:text>  
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

[1] - важная часть, она становится самой близкой, в противном случае кажется, что предыдущий родной брат возвращает первый. –

+0

Блестяще и намного проще, чем то, что я делал. Это здорово! Спасибо. –

+0

@WilliamWalseth Фактически, 'previous-sibling' выбирает ** все ** из них. Но в XSLT 1.0 'xsl: value-of' возвращает только первый, в порядке документа. –

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