Если начать с узла обработки-инструкции элемента p, то как переместить позицию обработки-инструкции [1] перед элементом p? — XSLT

#xslt #xslt-2.0

#xslt #xslt-2.0

Вопрос:

Если начать с узла обработки-инструкции элемента p, то как переместить позицию обработки-инструкции [1] перед элементом p? — XSLT
Ввод

 <root>
    <p><?page 1?>aaaa bbbb <?page 2?>cccccc</p>
    <p>aaaa <?page 3?>bbbb <?page 4?>ccccc</p>
</root>
  

Ожидаемый результат

 <root>
    <?page 1?><p>aaaa bbbb <?page 2?>cccccc</p>
    <p>aaaa <?page 3?>bbbb <?page 4?>ccccc</p>
</root>
  

XSLT

 <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="p[count(processing-instruction()) > 1]">
    <xsl:apply-templates select="processing-instruction()[1]"/>
    <xsl:copy>
        <xsl:apply-templates select="node() except processing-instruction()[1]"/>
    </xsl:copy>
</xsl:template>
  

Ответ №1:

Решаемая

     <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="p[count(processing-instruction()) > 1 and child::processing-instruction()[not(preceding-sibling::node())]]">
    <xsl:apply-templates select="processing-instruction()[1]"/>
    <xsl:copy>
        <xsl:apply-templates select="node() except processing-instruction()[1]"/>
    </xsl:copy>
</xsl:template>
  

Комментарии:

1. Вы также можете проверить match="p[node()[1][self::processing-instruction()]]"> , что немного короче.