处理元素取决于前一个兄弟的位置

时间:2016-05-23 17:52:09

标签: xml xslt

是否有办法处理元素<list_x>,具体取决于preceding-sibling轴上某些节点的位置?

XML代码:

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <text/>
        <text/>
        <text/>
        <list_num_start/>
        <list_num/>
        <list_num/>
        <list_x/>
        <text/>
        <text/>
        <text/>
        <list_square_start/>
        <list_square/>
        <list_square/>
        <list_x/>
    </root>

模板:

<xsl:template match="list_x">
    <xsl:element name="li">
        <xsl:attribute name="class"><xsl:value-of select="name()"/></xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
    <xsl:choose>
        <xsl:when test="position(preceding-sibling::list_num_start[last()]) &lt; position(preceding-sibling::list_square_start[last()])">
            <xsl:text disable-output-escaping="yes">&lt;/ol&gt;</xsl:text>
        </xsl:when>
        <xsl:otherwise>...</xsl:otherwise>
    </xsl:choose>
</xsl:template>

不幸的是position()不允许任何参数。

输出应为:

<root>
    <text/>
    <text/>
    <text/>
    <ol>
        <li class="list_num_start"/>
        <li class="list_num"/>
        <li class="list_num"/>
        <li class="list_x"/>
    </ol>
    <text/>
    <text/>
    <text/>
    <ul>
        <li class="list_square_start"/>
        <li class="list_square"/>
        <li class="list_square"/>
        <li class="list_x"/>
    </ul>
</root>

1 个答案:

答案 0 :(得分:1)

您可以尝试:

  <xsl:when test="count(preceding-sibling::list_num_start[1]/preceding-sibling::*) &lt; 
             count(preceding-sibling::list_square_start[1]/preceding-sibling::*)">

这会在您要查找的元素之前对元素进行计数。

我将list_num_start[last()]更改为list_num_start[1],因为我假设您正在寻找当前的元素list_num_start。