Вопрос по XSLT для устранения родительского узла, где дочерний элемент находится в разделе CDATA - PullRequest
0 голосов
/ 22 октября 2018

У меня есть оригинальное XML-сообщение, которое выглядит ниже.

<Message>
    <Header>
        <MsgVerNo>1.0</MsgVerNo>
        <SourceId>XXX</SourceId>
        <MsgRefNo>1234567890</MsgRefNo>
        <LoginId>007</LoginId>
    </Header>
    <Body>
        <![CDATA[<txn>
<id>1234567</id>
<name>XXXX</name>
        </txn>]]>
    </Body>
</Message>

Я хочу преобразовать его, как показано ниже.и должен быть удален, в то время как дочерние узлы должны остаться.Кроме того, CData, обертка которого также должна быть удалена.

<Message>
    <MsgVerNo>1.0</MsgVerNo>
    <SourceId>XXX</SourceId>
    <MsgRefNo>1234567890</MsgRefNo>
    <LoginId>007</LoginId>
    <txn>
        <record>
            <id>1234567</id>
            <name>XXXX</name>
        </record>
    </txn>
</Message>

Я пытался использовать ниже XSLT.Но вывод не желателен.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />
    <xsl:strip-space elements="*" />
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Header">
        <xsl:copy-of select="node()"/>
    </xsl:template>
    <xsl:template match="Body">
        <xsl:copy-of select="node()"/>
    </xsl:template>
</xsl:stylesheet>

Вывод

<Message>
<MsgVerNo>1.0</MsgVerNo>
<SourceId>XXX</SourceId>
<MsgRefNo>1234567890</MsgRefNo>
<LoginId>007</LoginId>
    &lt;txn&gt;
&lt;id&gt;1234567&lt;/id&gt;
&lt;name&gt;XXXX&lt;/name&gt;
    &lt;/txn&gt;
</Message>

У меня пока нет везения.Любая помощь от эксперта, пожалуйста.Спасибо.

1 Ответ

0 голосов
/ 22 октября 2018

Элемент CDATA означает, что данные между ними не будут интерпретироваться как XML вашим анализом.Это конкретно цель CDATA.Вы можете отправлять символьные данные, включая <>, без анализатора, пытающегося его интерпретировать и, возможно, потерпевшего неудачу.

Для всех целей и задач ваш узел Body просто содержит текст.Вы можете прочитать его как текст и даже удалить тег CDATA, однако это все равно оставляет текст, похожий на XML, а не что-то, что интерпретируется как XML.

Вы можете использовать следующее для получения содержимого, однако, если вы хотите дополнительно проанализировать содержимое элемента body, вам придется передать его, например, в другой XSLT.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />
    <xsl:strip-space elements="*" />
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Header">
        <xsl:copy-of select="node()"/>
    </xsl:template>
    <xsl:template match="Body">
        <xsl:value-of select="." disable-output-escaping="yes"/>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...