Удалите xmlns из корневого тега, сохранив другие теги, такие как xmlns: xsd и xmlns: xsi - PullRequest
0 голосов
/ 28 ноября 2018

Я не очень знаком с XSLT.Я пытаюсь удалить пространство имен xmlns из корневого тега, сохраняя другие теги, такие как xmlns: xsd и xmlns: xsi, используя xslt.Из Интернета я получил некоторую помощь по удалению пространства имен xmlns, но этот код также удаляет xmlns: xsd.Пожалуйста помоги.Заранее спасибо.

Это мой xsl-код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"
 xmlns:old="http://www.example.com"    exclude-result-prefixes="old">

<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="old:*">
   <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet> 

Это мой вводный xml:

<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://www.example.com" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xsi:schemaLocation="http://www.example.com/schemaLocation">

<name>abc</name>
<name>efg</name>

</Data>

При запуске XSL для входного XML я получаюследующий XML

<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.example.com/schemaLocation">

<name>abc</name>
<name>efg</name>

</Data>

желаемый выходной XML:

<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xsi:schemaLocation="http://www.example.com/schemaLocation">

<name>abc</name>
<name>efg</name>

</Data>

1 Ответ

0 голосов
/ 28 ноября 2018

Отсутствующее объявление пространства имен нигде не используется в документе XML, поэтому ваш процессор совершенно прав, отказавшись от него.

Вы можете попытаться принудительно скопировать его:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:copy-of select="@* | namespace::*[name()]"/>
        <xsl:apply-templates select="node()"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

, но не все процессоры дадут ожидаемый результат(Ксалан, например, не будет).

...