尝试匹配另一个元素的同级元素之后的元素时发生XSLT错误

尝试匹配另一个元素的同级元素之后的元素时发生XSLT错误,xslt,xpath,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: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>

我想匹配这个。。。
……但我不想和这个相提并论。

。。。
我正在查找前面的同级(上面示例中的第一个w:rPr元素),但是如果我尝试

<xsl:template match="w:rPr[w:sz[@w:val='44']]/following-sibling::w:t"> ... 
。。。
我得到一个模式编译失败的错误(
xsltparserror:xsltCompilePattern:failed to compile


我假设问题出在XPath上,但我不知道是什么。建议?

尝试颠倒您的逻辑,并匹配
w:t
,其前面的兄弟姐妹是与您的条件匹配的
w:rPr

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

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

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

XSLT2.0:

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

XSLT 3.0:

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


XSLT1.0官方不允许在匹配模式中使用全局变量,尽管我相信一些处理器取消了这一限制。

您的两个XPath似乎都很好。你能公布全部错误吗?您是否定义了命名空间
w
?XSLT模式语法是XPath表达式语法的一个子集。不能使用以下同级轴(谓词内除外,其中允许使用完整XPath)
<xsl:template match="*[. intersect $wonderElements]"/>
<xsl:template match="$wonderElements"/>