XSLT:找到所选元素上方的第一个元素

时间:2017-01-19 22:10:36

标签: xslt xpath docx

我想在docx中的表之前获得第一个标题(h1)。

我可以获得所有标题:

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

但不幸的是,处理器不接受

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

以下是从docx中提取的简化XML文件: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>

感谢Daniel Haley,我能找到解决这个问题的方法。我会在这里发布,所以它是我在下面发布的pastebin的独立。

<?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>

2 个答案:

答案 0 :(得分:1)

没有Minimal, Complete, and Verifiable example很难回答,但请尝试:

NSUserDefaults

答案 1 :(得分:1)

假设您可以使用XSLT 2.0(现在大多数人都可以),我发现这里有一个有用的技术是拥有一个选择所有相关节点的全局变量:

<xsl:variable name="special" 
  select="//w:tbl/preceding-sibling::w:p[w:pPr/w:pStyle[@w:val='berschrift1']][1]"/>

然后在模板规则中使用此变量:

<xsl:template match="w:p[. intersect $special]"/>

在XSLT 3.0中,您可以将其缩小为

<xsl:template match="$special"/>