我很难匹配另一个元素的后续兄弟元素。
<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上,但我无法弄清楚是什么。建议?
答案 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不允许匹配模式中的全局变量,但我相信一些处理器会解除此限制。