#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()]]">
, что немного короче.