在XSLT中仅访问直接前一个兄弟节点

5
我正在使用XSLT 1.0。目前我在<w:t>模板中。我想要检查前一个兄弟节点w:r(id=3)是否有<w:fldChar w:fldCharType="end"/>
我只想要直接的前一个兄弟节点,而不是具有id=2id=1w:r
<t xmlns:w="http://example.com">
    <w:r id="1">
        <w:fldChar w:fldCharType="start"/>
    </w:r>
    <w:r id="2">
        <w:fldChar w:fldCharType="separate"/>
    </w:r>
    <w:bookmarkStart w:id="0" w:name="tocStartRef_1"/>
    <w:r id="3">
        <w:fldChar w:fldCharType="end"/>
    </w:r>
    <w:bookmarkEnd w:id="0"/>
    <w:r id="4">
        <w:rPr>
            <w:rStyle w:val="Span"/>
            <w:rFonts w:ascii="arial" w:eastAsia="arial" 
                      w:hAnsi="arial" w:cs="arial"/>
            <w:b/>
            <w:sz w:val="32"/>
        </w:rPr>
        <w:t>Fonts</w:t>
    </w:r>
</t>

请发布格式良好且正确缩进的XML。下次我会给你点踩。 - Flack
请注意,w:t元素没有前置兄弟w:r,只有前置元素。 - user357812
1个回答

13

可以使用xpath的preceding-sibling轴,像这样:

preceding-sibling::w:r[1]/w:fldChar/@w:fldCharType = 'end'

该代码将选择最近的 ([1]) 名为 w:rpreceding-sibling,然后下降到名为 w:fldChar 的任何子元素,然后选择任何来自其中名为 w:fldCharType 的属性,如果存在任何这样的节点其文本为 'end',则返回 true。


8
另外,值得一提的是 ancestorancestor-or-selfprecedingpreceding-sibling 轴都是反向轴,因此位置谓词可能会让人感到意外。 - Flack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接