Добавить новый элемент в XML через XSLT 1.0, но без xmlns

#xml #xslt #xslt-1.0

#xml #xslt #xslt-1.0

Вопрос:

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

 <?xml version="1.0" encoding="UTF-8"?>  <ITIN3 />
<Export xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
creationDateTime="2018-09-29T12:53:10 02:00" transLanguage="EN" baseLanguage="EN" 
messageID="24242525" maximoVersion="7 6 20190514-1348 V7611-365" event="1">
<MRCSet>
  <MRC action="Add">
     <PONUM>MPO15114</PONUM>
     <POREVISIONNUM>0</POREVISIONNUM>      
  </MRC>
</MRCSet>
</Export>
  

Я применил этот XSLT:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
 xmlns:mea="http://www.ibm.com/maximo" exclude-result-prefixes="mea">
 <xsl:output omit-xml-declaration="no" indent="yes" encoding="UTF-8"/>
 <xsl:strip-space elements="*"/>
 
   <!-- Identity transform -->
   <xsl:template match="@* | node()">
     <xsl:copy>
   <xsl:apply-templates select="@* | node()"/>

   </xsl:copy> 
   </xsl:template>

   <xsl:template match="/mea:Export/mea:MRCSet/mea:MRC">
   <xsl:copy>
 
   <xsl:copy-of select="@*"/>
   <NEWINFO>1</NEWINFO>
   <xsl:copy-of select="node()"/>

    </xsl:copy>
  </xsl:template>
  </xsl:stylesheet>
  

И результат приведен ниже. Но я не хочу иметь это пространство имен xmlns. Я просто хочу новый элемент, как я его написал.

 <?xml version="1.0" encoding="UTF-8"?>
<Export xmlns="http://www.ibm.com/maximo"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        creationDateTime="2018-09-29T12:53:10 02:00"
        transLanguage="EN"
        baseLanguage="EN"
        messageID="24242525"
        maximoVersion="7 6 20190514-1348 V7611-365"
        event="1">
   <MRCSet>
  <MRC action="Add">
     <NEWINFO xmlns="">1</NEWINFO >
     <PONUM>MPO15114</PONUM>
     <POREVISIONNUM>0</POREVISIONNUM>
      </MRC>
   </MRCSet>
</Export>
  

Ответ №1:

Добавьте xmlns="http://www.ibm.com/maximo" к xsl:stylesheet элементу или, по крайней мере, к NEWINFO элементу.

Комментарии:

1. Спасибо. Но можете ли вы объяснить мне, почему это так?

2. Ваш ввод содержит элементы в пространстве http://www.ibm.com/maximo имен, и, похоже, вы хотите добавить элемент в это пространство имен. Ваша попытка добавляет элемент в пространство имен no, что xmlns="" приводит к результату in.

3. Спасибо! Теперь я понимаю

Ответ №2:

Вы неправильно анализируете ситуацию:

Все элементы вашего исходного документа находятся в пространстве имен по умолчанию xmlns="http://www.ibm.com/maximo" , и ваша таблица стилей копирует их как есть.

Ваш добавленный элемент is no-namespace — и xmlns="" объявление указывает на это.