我有以下XML结构
<root>
<orderedlist>
<item num="1"><para num="1"></para>
<para num="2"></para>
</item>
<orderedlist>
</root>
我正在使用item
模板
<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
模板执行此操作。
请让我知道我该怎么做。
由于
答案 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>
。