尝试匹配跟随另一个元素

时间:2017-05-31 21:09:42

标签: xslt xpath

我很难匹配另一个元素的后续兄弟元素。

<w:p>
    <w:r>
        <w:rPr>
            <w:color w:val="002D56"/>
            <w:sz w:val="44"/>
            <w:szCs w:val="44"/>
        </w:rPr>
        <w:t>I want to match this...</w:t>
    </w:r>
    <w:r>
         <w:rPr>
             <w:rFonts w:cstheme="minorHAnsi"/>
             <w:sz w:val="28"/>
             <w:szCs w:val="28"/>
         </w:rPr>
         <w:t>...but I don't want to match this.</w:t>
    </w:r>
</w:p>

<xsl:template match="w:rPr[w:sz[@w:val='44']]"> ...

我找到了前面的兄弟(上面示例中的第一个w:rPr元素),但是如果我尝试

<xsl:template match="w:rPr[w:sz[@w:val='44']]/following-sibling::w:t"> ... 

我收到模式无法编译的错误(XSLTParseError: xsltCompilePattern : failed to compile)。

我假设问题出在我的XPath上,但我无法弄清楚是什么。建议?

2 个答案:

答案 0 :(得分:3)

尝试撤消您的逻辑,并匹配其前一个兄弟是符合您条件的w:t的{​​{1}}

w:rPr

注意,您也可以尝试这一点,但这会匹配兄弟姐妹之后或之前的<xsl:template match="w:t[preceding-sibling::w:rPr[w:sz/@w:val='44']]">

w:t

答案 1 :(得分:2)

我有时会在这里使用另一种方法,即定义包含特定类型的所有节点的全局变量,然后在模式中使用这些全局变量。例如:

<xsl:variable name="wonderElements"
         select="//w:rPr[w:sz[@w:val='44']]/following-sibling::w:t"/>

XSLT 2.0:

<xsl:template match="*[. intersect $wonderElements]"/>

XSLT 3.0:

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

官方XSLT 1.0不允许匹配模式中的全局变量,但我相信一些处理器会解除此限制。