我有以下xsl模板:
<xsl:template match="para">
<fo:block xsl:use-attribute-sets="paragraph.para">
<!-- if first para in document -->
<!--<xsl:if test="//para[1] intersect .">-->
<xsl:if test="//para[1] intersect .">
<xsl:attribute name="space-after">10pt</xsl:attribute>
<xsl:attribute name="background-color">yellow</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::title]">
<xsl:attribute name="text-indent">0em</xsl:attribute>
</xsl:when>
<xsl:when test="parent::item">
<xsl:attribute name="text-indent">0em</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="text-indent">1em</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
我遇到的问题是验证模板的当前节点是来自以下xml的文档中的第一个para节点:
<document>
<section>
<paragraph>
<para>Para Text 1*#</para>
<para>Para Text 2</para>
</paragraph>
</section>
<paragraph>
<para>Para Text 3*</para>
<para>Para Text 4</para>
<para>Para Text 5</para>
<sub-paragraph>
<para>Para Text 6*</para>
<para>Para Text 7</para>
</sub-paragraph>
</paragraph>
<appendix>
<paragraph>
<para>Para Text 8*</para>
</paragraph>
<paragraph>
<para>Para Text 9</para>
</paragraph>
</appendix>
</document>
我目前使用的xpath是“// para [1] intersect”。这是为每组para选择第一个para(用XML样本中的*表示)。关于如何在文档中选择para的第一次出现(用#表示)的任何想法?
答案 0 :(得分:6)
在XPath 1.0(XSLT 1.0)中,可以使用:
count( (//para)[1] | .) = 1
这也适用于XPath 2.0,但可能不如使用intersect
运算符那么有效。
我建议使用以下XPath 2.0表达式:
(//para)[1] is .
请注意使用 the XPath 2.0 is
operator 。
答案 1 :(得分:1)
我自己制定了解决方案,在xpath中需要稍微更改,在// para周围添加括号限制选择:
“(// para)[1]相交。”你也可以使用“(// para)[1] is。”得到相同的结果,在这个场合,我相信“是”版本更具可读性。