针对特定位置的父元素的XSLT 2.0 / XPATH测试

时间:2018-10-28 10:24:08

标签: xslt xpath xslt-2.0

<xsl:template match="lb">中的XSLT 2.0和XPATH中,我正在测试各种不同的case,其中每种情况下都会产生不同的HTML输出(使用xsl:choose/xsl:when)。

我想测试以下情况,其中lbseg元素内任何种类的第一个节点:

<seg><lb break="n"/>text</seg>

相比之下,这些测试将失败:

<seg>text<lb break="n"/>text</seg>

<seg><foo/><lb break="n"/>text</seg>

我尝试将parentposition()组合在一起,但是测试不正确。

非常感谢。

3 个答案:

答案 0 :(得分:2)

在我的视图中具有匹配lb的模板,然后使用xsl:choose/when可以通过精确的匹配模式(例如, xsl:template match="seg/node()[1][self::lb]"将匹配seg父级的任何第一个子节点,其中子级是lb元素。对于其他条件,您可以设置具有不同匹配模式的不同模板。

但是如果需要,您可以在. is parent::seg/node()[1]内使用xsl:template match="lb"来编写。

答案 1 :(得分:1)

/seg/child::node()[1]/name() = 'lb'

检查第一个孩子是否被命名为“ lb”

答案 2 :(得分:1)

您可以简单地测试之前是否没有兄弟姐妹:

make

请注意,go不仅包括元素和文本,还包括注释和处理说明。

或者,如果您有一个与<xsl:when test="not(preceding-sibling::node())"> 相匹配的模板,则可以在其中执行类似的操作...

node()

然后,由于seg<xsl:template match="seg"> <xsl:copy> <xsl:apply-templates /> </xsl:copy> </xsl:template> 的缩写,因此您可以在模板中使用<xsl:apply-templates />

<xsl:apply-templates select="node()" />

如果“ seg”模板执行了position(),这将无法正常工作。

有关进行中的测试的示例,请参见bastawigo