根据与孩子的父距离找到模式

时间:2014-06-18 09:25:50

标签: xslt xpath

我有以下XML结构

<root>
<orderedlist>
<item num="1"><para num="1"></para>
<para num="2"></para>
</item>
<orderedlist>
</root>

我正在使用item模板

中的以下XPath
<xsl:template match="item">
<xsl:apply-templates select="./para/node()[1][self::page]" mode="first"/>
<li class="item">


      <xsl:for-each select="para">
      <div class="para">
      <xsl:choose>

<xsl:when test="name(../../parent::*[1]) = 'section'">

    <xsl:apply-templates select="../@num" mode="next"/>


</xsl:when>
<xsl:otherwise>

<xsl:if test="../@num"/>
<span class="item-num">
<xsl:value-of select="../@num"/>
</span>
</xsl:otherwise>



</xsl:choose>

       <xsl:apply-templates/>
    </div>
</xsl:for-each>
    </li>
</xsl:template>


<xsl:template mode="next" match="@num">



 <xsl:analyze-string select="." regex="([0-9]+)\.([0-9]+)\.([0-9]+)">
<xsl:matching-substring>
         <a name="{concat('P',regex-group(1),'-',regex-group(2),'-',regex-group(3))}"/>
    <span class="phrase">
    <xsl:value-of select="."></xsl:value-of>
    </span>  
</xsl:matching-substring>
<xsl:non-matching-substring>
 <xsl:analyze-string select="." regex="([0-9]+)\.([0-9]+)">
<xsl:matching-substring>
         <a name="{concat('P',regex-group(1),'-',regex-group(2))}"/>
    <span class="phrase">
    <xsl:value-of select="."></xsl:value-of>
    </span>  
</xsl:matching-substring>
<xsl:non-matching-substring>

    <xsl:value-of select="."></xsl:value-of>

</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:non-matching-substring>
</xsl:analyze-string>


<!--   <xsl:apply-templates select="../para"/></div>
      </li>-->

</xsl:template>

<xsl:template match="page[not(preceding-sibling::node()[not(self::text()) or normalize-space()])]"/>

 <xsl:template match="page" mode="first">
        <xsl:processing-instruction name="pb">
            <xsl:text>label='</xsl:text>
            <xsl:value-of select="./@num"/>
            <xsl:text>'</xsl:text>
            <xsl:text>?</xsl:text>
        </xsl:processing-instruction>

        <a name="{concat('pg_',./@num)}"/>
        <xsl:apply-templates/>
    </xsl:template>

但是对于para都是如此,但是我想选择其前面是父项的para,换句话说我想选择所谓的直接父项,在上面的例子中我想要选择para num="1",因为它是item的第一个孩子,我想从para模板执行此操作。

请让我知道我该怎么做。

由于

1 个答案:

答案 0 :(得分:2)

使用<xsl:template match="*/para[1]">...</xsl:template>,您有一个模板,该模板仅匹配作为其父级的第一个para子级的para个元素。或者使用<xsl:template match="item/para[1]">...</xsl:template>,模板仅匹配para父元素的第一个item子元素。

如果有其他子元素,并且您只想匹配para元素(如果它是第一个子元素),则使用<xsl:template match="item/*[1][self::para]">...</xsl:template>

相关问题