запрос xpath 2.0 - как проверить, является ли текущий элемент первым элементом с таким именем в документе xml - PullRequest
4 голосов
/ 23 марта 2010

У меня есть следующий шаблон 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>

Проблема, с которой я столкнулся, заключается в проверке того, что текущий узел шаблона является самым первым узлом para в документе из следующего xml:

<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." который выбирает первый параграф для каждой группы параграфов (обозначается * в примере XML). Любые идеи о том, как я могу просто выбрать первое вхождение пункта в документе (обозначается #)?

Ответы [ 2 ]

6 голосов
/ 24 марта 2010

В XPath 1.0 (XSLT 1.0) можно использовать :

count( (//para)[1] | .) = 1

Это также работает в XPath 2.0, но может быть менее эффективным, чем использование оператора intersect.

Я бы рекомендовал следующее выражение XPath 2.0 :

(//para)[1] is .

Обратите внимание на использование оператора XPath 2.0 is .

1 голос
/ 23 марта 2010

Я сам разработал решение, требуется небольшое изменение в xpath, добавление скобок вокруг // para ограничивает выбор:

"(// para) [1] intersect." Вы также можете использовать "(// para) [1] is." чтобы получить тот же результат, и в этом случае я верю, что версия "is" более читабельна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...