Я хочу получить первый заголовок (h1) перед таблицей в docx.XSLT: найдите первый элемент над выбранным элементом
я могу получить все заголовки с:
<xsl:template match="w:p[w:pPr/w:pStyle[@w:val='berschrift1']]">
<p>
<context>
<xsl:value-of select="." />
</context>
</p>
</xsl:template>
и я могу получить все таблицы
<xsl:template match="w:tbl">
<p>
<table>
<xsl:value-of select="." />
</table>
</p>
</xsl:template>
Но Unfortunetly процессор не принимает
<xsl:template match="w:tbl/preceding-sibling::w:p[w:pPr/w:pStyle[@w:val='berschrift1']]">
<p>
<table>
<xsl:value-of select="." />
</table>
</p>
</xsl:template>
Вот уменьшенная XML-файл, извлеченный из docx: http://pastebin.com/KbUyzRVv Я хочу что-то подобное е, что в результате:
<context>Let’s get it on</context> <- my heading
<table>data</table>
<context>Let’s get it on</context> <- my heading
<table>data</table>
<context>We’re in the middle of something</context> <- my heading
<table>data</table>
Благодаря Даниэлю Хейли я смог найти решение этой проблемы. Я отправлю его здесь, поэтому он не зависит от пастебина, который я публикую ниже.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:v="urn:schemas-microsoft-com:vml" exclude-result-prefixes="xsl w v">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="w:tbl">
<context>
<xsl:value-of select="(preceding-sibling::w:p[w:pPr/w:pStyle[@w:val = 'berschrift1']])[last()]"/>
</context>
<table>
<xsl:value-of select="."/>
</table>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Всегда указать, можно ли воспользоваться XSLT 2.0. –
Извините, это мой первый подход сделать что-то с XSLT. Это также прототип, поэтому я думаю, что пока есть не коммерческий процессор, версия не имеет значения. – froehli