XSLT — удалить некоторые теги, но сохранить содержимое по порядку

#html #xslt

#HTML #xslt

Вопрос:

У меня есть разметка, из которой я хотел бы удалить / преобразовать определенные теги, но сохранить данные.

Например, это:

 <div>This is some <b>bold</b> text inside of a div</div>
<p>This is <u>another <b>formatted</b></u> string...<br /></p>
  

должно стать так:

 <p>This is some <b>bold</b> text inside of a div</p>
<p>This is another <b>formatted</b> string...</p>
  

Использование apply-templates для соответствия каждому условию не работает из-за вложенности.

Как бы вы это сделали?

Ответ №1:

Звучит как задание для модифицированного преобразования идентификатора, например:

 <?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

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

    <!--This template turns all <div> into <p>-->
    <xsl:template match="div">
        <p>
            <xsl:apply-templates select="@*|node()"/>
        </p>
    </xsl:template>

    <!--This template removes all <u> and continues processing -->
    <xsl:template match="u">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>

</xsl:stylesheet>