2015-06-24 62 views
0

當我嘗試在XSLT 2.0的xsl:for-each循環中嘗試使用XPath之前的兄弟時,遇到語法錯誤。我看到的例子都沒有涉及這個具體案例。我正在迭代變量$ v1中的elemente序列。以下是XSLT的結構:如何通過變量在每個循環內指定前同步

<xsl:for-each select="$v1/*"> 
    <xsl:choose> 
     <!-- minus in previous element means loss --> 
     <xsl:when 
      test="matches(preceding-sibling::.[1]/.string(), '-')">  
     <xsl:copy> 
      <xsl:sequence 
       select="concat('Loss: ', ./string()"/>   
     </xsl:copy> 
     </xsl:when> 
     <!-- just copy node and children --> 
     <xsl:otherwise> 
     <xsl:sequence select="."/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 

這是對運行代碼的簡化。工作版本有正確編譯的其他when子句。我只顯示給我編譯時錯誤的when子句。

錯誤指的是Unexpected token "." after axis name。當我參考當前節點時,我使用matches(./string(), '(\(|\))'),我沒有問題。爲什麼我不能在前一個節點上使用相同的.

我正在使用Saxon HE9.5.1.4。

回答

0

當我參考當前節點我使用matches(./string(), '(\(|\))'),我沒有問題。爲什麼我不能在前一個節點上使用相同的.

恕我直言,應用相同的概念作爲./string()你上面提到的preceding-sibling會導致下面的表達式,而不是preceding-sibling::.[1]/.string()

./preceding-sibling::*[1]/string() 
0

相反的matches(preceding-sibling::.[1]/.string(), '-')你可能只是想matches(preceding-sibling::*[1], '-')相匹配,對前一兄弟元素節點或matches(preceding-sibling::node()[1], '-')以在任何類型的緊接在前的節點上匹配。沒有必要撥打string()

0

該語法同樣適用於我的情況

matches(preceding-sibling::td[1]/string(), '-') 

我轉化<td>元素的順序我for-each循環。

相關問題