在<xsl:template match="lb">
中的XSLT 2.0和XPATH中,我正在测试各种不同的case
,其中每种情况下都会产生不同的HTML输出(使用xsl:choose/xsl:when
)。
我想测试以下情况,其中lb
是seg
元素内任何种类的第一个节点:
<seg><lb break="n"/>text</seg>
相比之下,这些测试将失败:
<seg>text<lb break="n"/>text</seg>
<seg><foo/><lb break="n"/>text</seg>
我尝试将parent
和position()
组合在一起,但是测试不正确。
非常感谢。
答案 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。