Как удалить xsi: type = "xsd: string" & xsi: nil = "true" с помощью сопоставления XSLT? - PullRequest
0 голосов
/ 08 июня 2018

Я работаю над SAP NW PI (Process Integration), в настоящее время у нас есть входящая полезная нагрузка от сторонней системы, использующей SOAP. Полезная нагрузка похожа на

<GetReportBlock_C4C_-_Pre_Call_Preparation_Part2Response xmlns="C4C_Pre_Call_Preparation_Part2">
     <headers>
        <row>
           <cell xsi:type="xsd:string">Account</cell>
           <cell xsi:type="xsd:string">Product Group - Key</cell>
           <cell xsi:type="xsd:string">Product Group - Medium Text</cell>
           <cell xsi:type="xsd:string">Gross Sales (USD)</cell>
        </row>
     </headers>
     <table>
        <row>
           <cell xsi:type="xsd:string" xsi:nil="true"/>
           <cell xsi:type="xsd:string" xsi:nil="true"/>
           <cell xsi:type="xsd:string" xsi:nil="true"/>
           <cell xsi:type="xsd:double" xsi:nil="true"/>
        </row>
     </table>
     <user>XXX</user>
     <documentation>C4C - Pre Call Preparation_Part2</documentation>
     <documentname>C4C Pre Call Preparation - Part_2</documentname>
     <lastrefreshdate>2018-06-08T10:21:41.0</lastrefreshdate>
     <creationdate>2018-05-29T10:33:25.438</creationdate>
     <creator>XXX</creator>
     <isScheduled>XXX</isScheduled>
     <tableType>XXXX</tableType>
     <nbColumns>X/nbColumns>
     <nbLines>X</nbLines>
  </GetReportBlock_C4C_-_Pre_Call_Preparation_Part2Response>

Первая проблема, которая должна иметь пространство именпрефикс ns0 для каждого элемента.эта проблема была исправлена ​​с помощью приведенного ниже XSLT Mapping

        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="C4C_Pre_Call_Preparation_Part2">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="ns0:{name()}" namespace="C4C_Pre_Call_Preparation_Part2">
            <xsl:copy-of select="namespace::*"/>
            <xsl:apply-templates select="node()|@*"/, how should i accomplish this.
>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Теперь моя проблема состоит в том, чтобы удалить атрибуты xsi из элементов, как мне это сделать?

1 Ответ

0 голосов
/ 08 июня 2018

Чтобы удалить все атрибуты xsi:, вы можете использовать пустой соответствующий ему шаблон

<xsl:template match="@xsi:*" />

Но есть и другие проблемы с вашим XML / XSLT:

  • Пространство именне является абсолютным, поэтому, например, измените пространство имен на что-то вроде http://C4C_Pre_Call_Preparation_Part2.
  • Ваш <xsl:element name="ns0:{name()}" ...> должен скорее использовать local-name(), чем name().
  • Вы забылиуказать пространство имен для префикса xsi.Обычно для этого используется xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance".
...