当我尝试在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 :(得分:0)
当我引用当前节点时,我使用
matches(./string(), '(\(|\))')
,我没有问题。为什么我不能对前一个节点使用相同的.
?
恕我直言,使用与./string()
上面提到的preceding-sibling
相同的概念会产生以下表达式,而不是preceding-sibling::.[1]/.string()
:
./preceding-sibling::*[1]/string()
答案 1 :(得分:0)
而不是matches(preceding-sibling::.[1]/.string(), '-')
您可能只希望matches(preceding-sibling::*[1], '-')
匹配前一个兄弟元素节点或matches(preceding-sibling::node()[1], '-')
以匹配任何类型的前一个节点。无需拨打string()
。
答案 2 :(得分:0)
此语法适用于我的案例
matches(preceding-sibling::td[1]/string(), '-')
我正在转换<td>
循环中的for-each
元素序列。