Удалить пространство имен XML по умолчанию из корня с помощью XSLT - PullRequest
0 голосов
/ 26 июня 2018

У меня есть этот XML-файл:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<NAXML-MaintenanceRequest version="3.4" xmlns="http://www.naxml.org/POSBO/Vocabulary/2003-10-16">
    <TransmissionHeader>
        <StoreLocationID>AB123</StoreLocationID>
        <VendorName>VeriFone</VendorName>
        <VendorModelVersion>Commander Site Controller</VendorModelVersion>
    </TransmissionHeader>
    <ComboMaintenance>
        <TableAction type="initialize"/>
        <RecordAction type="addchange"/>
    </ComboMaintenance>
</NAXML-MaintenanceRequest>

Я бы хотел попасть сюда, просто удалив xmlns="" на узле NAXML-MaintenanceRequest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<NAXML-MaintenanceRequest version="3.4">
    <TransmissionHeader>
        <StoreLocationID>AB123</StoreLocationID>
        <VendorName>VeriFone</VendorName>
        <VendorModelVersion>Commander Site Controller</VendorModelVersion>
    </TransmissionHeader>
    <ComboMaintenance>
        <TableAction type="initialize"/>
        <RecordAction type="addchange"/>
    </ComboMaintenance>
</NAXML-MaintenanceRequest>

Я видел способы удаления пространства имен по умолчанию для других элементов, но не для корневого узла. Может ли кто-нибудь указать мне ресурс / предоставить фрагмент, который просто удаляет пространство имен по умолчанию на корневом узле?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018
<xsl:template match="@*|processing-instruction()|comment()">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
       <xsl:element name="{local-name()}">
           <xsl:if test="@version">
               <xsl:attribute name="version">
                   <xsl:value-of select="@version"/>
               </xsl:attribute>
           </xsl:if>
           <xsl:apply-templates/>
       </xsl:element>
    </xsl:template>
    <xsl:template match="m:TableAction">
       <xsl:element name="{ local-name()}">
            <xsl:apply-templates select="@*"/>
           <xsl:apply-templates/>
       </xsl:element>
    </xsl:template>
    <xsl:template match="m:RecordAction">
        <xsl:element name="{ local-name()}">
            <xsl:apply-templates select="@*"/>
        </xsl:element>
    </xsl:template>
check it
0 голосов
/ 26 июня 2018

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

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

Просто адаптируйте преобразование идентификации для копирования всех узлов как есть, кроме специально обработанных элементов, удалив их из любого пространства имен:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="@*|processing-instruction()|comment()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...