Как заменить корневой тег реальным именем типа сообщения? - PullRequest
0 голосов
/ 14 мая 2019

Я хотел бы узнать ваше мнение относительно кода XSLT, который я могу использовать для замены моего корневого тега на фактическое имя сообщения (ns1).

'Rechnungen' следует заменить нафактическое имя типа сообщения с дополнительным заголовком.Спасибо!

Исходный XML:

<?xml version="1.0" encoding="UTF-8"?>
<ns2:CU_DE_Fitnesfirst_INVOIC_CSV xmlns:ns2="http://test.com">
  <Rechnungen>
    <Kopf>
      <K_Belegdatum>Belegdatum</K_Belegdatum>
      <K_Leistungsdatum>Leistungsdatum</K_Leistungsdatum>
      <K_VBelN>Faktura</K_VBelN>
    </Kopf>
    <Positionen>
      <P_Belegdatum>12092018</P_Belegdatum>
      <P_Leistungsdatum>22072018</P_Leistungsdatum>
      <P_VBelN>12345</P_VBelN>
    </Positionen>
  </Rechnungen>
  <Rechnungen>
    <Kopf>
      <K_Belegdatum>Belegdatum</K_Belegdatum>
      <K_Leistungsdatum>Leistungsdatum</K_Leistungsdatum>
      <K_VBelN>Faktura</K_VBelN>
    </Kopf>
    <Positionen>
      <P_Belegdatum>12092018</P_Belegdatum>
      <P_Leistungsdatum>29072018</P_Leistungsdatum>
      <P_VBelN>67890</P_VBelN>
    </Positionen>
  </Rechnungen>
</ns2:CU_DE_Fitnesfirst_INVOIC_CSV>

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

 <?xml version="1.0" encoding="UTF-8"?>
<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
  <ns0:Message1>
    <ns2:CU_DE_Fitnesfirst_INVOIC_CSV xmlns:ns2="http://test.com">
      <Kopf>
        <K_Belegdatum>Belegdatum</K_Belegdatum>
        <K_Leistungsdatum>Leistungsdatum</K_Leistungsdatum>
        <K_VBelN>Faktura</K_VBelN>
      </Kopf>
      <Positionen>
        <P_Belegdatum>12092018</P_Belegdatum>
        <P_Leistungsdatum>22072018</P_Leistungsdatum>
        <P_VBelN>12345</P_VBelN>
      </Positionen>
    </ns2:CU_DE_Fitnesfirst_INVOIC_CSV>
    <ns2:CU_DE_Fitnesfirst_INVOIC_CSV xmlns:ns2="http://test.com">
      <Kopf>
        <K_Belegdatum>Belegdatum</K_Belegdatum>
        <K_Leistungsdatum>Leistungsdatum</K_Leistungsdatum>
        <K_VBelN>Faktura</K_VBelN>
      </Kopf>
      <Positionen>
        <P_Belegdatum>12092018</P_Belegdatum>
        <P_Leistungsdatum>29072018</P_Leistungsdatum>
        <P_VBelN>67890</P_VBelN>
      </Positionen>
    </ns2:CU_DE_Fitnesfirst_INVOIC_CSV>
  </ns0:Message1>
</ns0:Messages>

1 Ответ

0 голосов
/ 14 мая 2019

Начните с шаблона идентификации, так как он будет обрабатывать копирование всех существующих узлов без изменений.

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

Затем вы хотите, чтобы шаблон пропускал ns2:CU_DE_Fitnesfirst_INVOIC_CSV, чтобы он не копировался в исходное положение

<xsl:template match="ns2:CU_DE_Fitnesfirst_INVOIC_CSV">
  <xsl:apply-templates />
</xsl:template>

Вместо этого вам нужен шаблон, соответствующий Rechnungen, где вы можете заменить его копией родительского элемента

<xsl:template match="Rechnungen">
  <xsl:element name="{../name()}" namespace="{../namespace-uri()}">
    <xsl:apply-templates />
  </xsl:element>
</xsl:template>

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns2="http://test.com"
    version="2.0">

  <xsl:output method="xml" indent="yes" />

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

  <xsl:template match="ns2:CU_DE_Fitnesfirst_INVOIC_CSV">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="Rechnungen">
    <xsl:element name="{../name()}" namespace="{../namespace-uri()}">
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Обратите внимание: если вы используете XSLT 3.0, вы можете немного привести в порядок код и сделать это вместо этого ....

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns2="http://test.com"
    version="3.0">

  <xsl:output method="xml" indent="yes" />

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="ns2:CU_DE_Fitnesfirst_INVOIC_CSV">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="Rechnungen">
    <xsl:variable name="currentChildren" select="node()" />
    <xsl:copy select="..">
      <xsl:apply-templates select="$currentChildren" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Также обратите внимание, я не был уверен, был ли ns0:Messages во входном XML или нет, или вы хотели добавить его. Если необходимо добавить этот шаблон, просто добавьте этот шаблон в один из приведенных выше XSLT:

<xsl:template match="/">
  <ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
    <ns0:Message1>
      <xsl:apply-templates />
    </ns0:Message1>
  </ns0:Messages>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...