2017-05-31 86 views
2

我很難匹配另一個元素的後續兄弟元素。XSLT錯誤,當試圖匹配另一個元素的兄弟後跟一個元素

<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']]"> ... 

我發現前面的兄弟(第1W:在上面的示例中RPR元素),但如果我嘗試

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

我得到一個錯誤該模式未能編譯(XSLTParseError: xsltCompilePattern : failed to compile)。

我假設問題與我的XPath,但我無法弄清楚什麼。建議?

+0

你的兩個xpaths似乎很好。你能發佈完整的錯誤嗎?你是否定義了命名空間'w'? – SomeDude

+3

XSLT模式語法是XPath表達式語法的子集。您不能使用以下兄弟軸(除了在允許完整XPath的謂詞中) –

回答

3

嘗試扭轉你的邏輯,並匹配其前面的兄弟的w:tw:rPr符合條件

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

注意,你也可以試試這個,但是這會匹配w:t這要麼之後或之前的兄弟姐妹

<xsl:template match="w:r[w:rPr/w:sz/@w:val='44']/w:t"> 
2

還有另一種方法,我有時在這裏使用,它是定義全局變量,其中包含特定類型的所有節點,然後使用這些全局變量bal模式中的變量。例如:

<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不允許在匹配模式的全局變量,但我相信,一些處理器解除這種限制。

相關問題