Удаление тегов заголовков, включая конверт, тело и т. Д. - PullRequest
0 голосов
/ 05 мая 2020

У меня есть источник XML, в котором мне нужно удалить теги заголовка и как бы извлечь под- XML из основного XML. Ниже мой ввод -

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/ " xmlns:xs="http://www.w3.org/2001/XMLSchema " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance " xmlns:n="http://schemas.xmlsoap.org/soap/envelope/ " xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:event="some namespace" xmlns:head="some namespace">
    <soap:Header>
        <head:someHeader>
            <!--content-->
        </head:someHeader>
    </soap:Header>
    <soap:Body>
        <event:parent>
            <child>
                <!--internal content-->
            </child>
        </event:parent>
    </soap:Body>
</soap:Envelope>

И ниже мой ожидаемый результат -

        <parent>
            <child>
                <!--internal content-->
            </child>
        </parent>

Сначала я выполняю преобразование идентичности, а затем пытаюсь удалить конверт и тело, но это не кажется работать. Вот моя попытка, которая не работает -

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" exclude-result-prefixes="soap">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="soap:Envelope/soap:Header"/>
    <xsl:template match="Envelope/Body">
        <xsl:copy-of select="*"/>
    </xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Вы можете выбрать элемент event:parent, преобразовать его и скопировать остальные

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="some namespace"
    exclude-result-prefixes="#all"
    version="3.0">

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

  <xsl:template match="/">
    <xsl:apply-templates select="//parent"/>
  </xsl:template>

  <xsl:template match="parent">
      <xsl:element name="{local-name()}">
          <xsl:apply-templates/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>
1 голос
/ 05 мая 2020

Вы можете просто:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:event="some namespace"
exclude-result-prefixes="soap event">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/soap:Envelope">
    <parent>
        <xsl:copy-of select="soap:Body/event:parent/*" copy-namespaces="no"/>
    </parent>
</xsl:template>

</xsl:stylesheet>

Демо : https://xsltfiddle.liberty-development.net/bEzknsY

...