XSLT: обрезать теги внутри определенного тега, но сохранить внешний тег - PullRequest
0 голосов
/ 11 марта 2019

У меня есть следующий dummied xml-файл, и мне нужно удалить теги в TXT.Я создал таблицу стилей, которая удаляет все теги в файле, но я просто хочу, чтобы она удаляла только теги в блоке TXT.Какие изменения мне нужно внести в XSLT, чтобы добиться этого?

XML

<DOC>
    <ID>1234</ID>
<TXT>
<A><DESC type="PERSON">George Washington</DESC> lived in a house called <DESC type="PLACE">Mount Vernon.</DESC></A>
<A><DESC type="PERSON">Thomas Jefferson</DESC> lived in a house called <DESC type="PLACE">Monticello.</DESC></A>
</TXT>
</DOC>

XSLT

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template name="strip-tags">
        <xsl:param name="TXT"/>
        <xsl:choose>
            <xsl:when test="contains($TXT, 'A')">
                <xsl:value-of select="$TXT"/>
                <xsl:call-template name="strip-tags">
                    <xsl:with-param name="TXT" select="substring-after($TXT, 'A')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$TXT"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Токовый выход

<?xml version="1.0" encoding="UTF-8"?>
    1234

    George Washington lived in a house called Mount Vernon.
    Thomas Jefferson lived in a house called Monticello.

Желаемый вывод

<?xml version="1.0" encoding="UTF-8"?>
    <DOC><ID>1234</ID>

    <TXT>George Washington lived in a house called Mount Vernon.
    Thomas Jefferson lived in a house called Monticello.</TXT>
    </DOC>

1 Ответ

1 голос
/ 11 марта 2019

Переформулировка вашего запроса:

каждый узел превращается в себя, кроме тех потомков элемента TXT элемента

Используйте преобразование идентичности :

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="TXT//*">
        <xsl:apply-templates />
    </xsl:template>
</xsl:stylesheet>

Результат:

<DOC>
    <ID>1234</ID>
   <TXT>
George Washington lived in a house called Mount Vernon.
Thomas Jefferson lived in a house called Monticello.
</TXT>
</DOC>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...