Замена для саксонии: если и саксон: перед функциями в xslt 2.0 - PullRequest
0 голосов
/ 31 октября 2009

Есть ли замена для саксонской: если и саксонский: до функционирует в XSLT 2.0 / XPath 2.0?

У меня есть такой код:

<xsl:variable name="stop"
  select="(following-sibling::h:h1|following-sibling::h:h2)[1]" />

<xsl:variable name="between"
  select="saxon:if($stop,
                   saxon:before(following-sibling::*, $stop),
                   following-sibling::*)" />

Идея состоит в том, что переменная between должна содержать все элементы между текущим узлом и следующим элементом h1 или h2 (хранятся в переменной stop), или все остальные элементы, если рядом нет h1 h2.

Я хотел бы использовать этот код в новом шаблоне XSLT 2.0, и я ищу замену для saxon:if и saxon:before.

Ответы [ 3 ]

1 голос
/ 08 декабря 2010

saxon.if(A, B, C) теперь эквивалентно if (A) then B else C в XPath 2.0

0 голосов
/ 08 декабря 2010

Вы также можете использовать только одно выражение в XSLT / XPath 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="text()"/>
    <xsl:template match="p[position()=(1,3,4)]">
        <xsl:copy-of select="following-sibling::*
                                [not(self::h2|self::h1)]
                                [not(. >>
                                     current()
                                        /following-sibling::*
                                            [self::h2|self::h1][1])]"/>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<html>
    <p>1</p>
    <p>2</p>
    <h2>Header</h2>
    <p>3</p>
    <h1>Header</h1>
    <p>4</p>
    <p>5</p>
</html>

Выход:

<p>2</p><p>5</p>
0 голосов
/ 31 октября 2009

Вот мое решение:

<xsl:variable 
     name="stop"
     select="(following-sibling::h:h1|following-sibling::h:h2)[1]" />

<xsl:variable name="between">
    <xsl:choose>
        <xsl:when test="$stop">
            <xsl:sequence select="following-sibling::*[. &lt;&lt; $stop]" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:sequence select="following-sibling::*" />
         </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

Используются операторы <xsl:sequence> и << (закодированные как &lt;&lt;) из XSLT 2.0 / XPath 2.0.

Он не такой короткий, как оригинальная версия, но он больше не использует саксонские расширения.

...