Xslt для копирования внутреннего XML без неиспользуемых пространств имен - PullRequest
1 голос
/ 23 января 2012

Я хочу удалить пару неиспользуемых пространств имен из результирующего вывода из таблицы стилей xslt.

xml для подачи - это обертка вокруг другого сообщения xml, которое можно увидеть в BodyMessage элемент.Пример полного xml можно увидеть ниже:

<?xml version="1.0" encoding="utf-8"?>
<ns0:Wrapper xmlns:ns0="http://ref.fairyliquidplc.ads/Schema/Fairy/Wrapper/1.0" xmlns:mco="http://ref.fairyliquidplc.ads/Schema/Fairy/Common/1.0">
  <TaskName>SomeTaskName</TaskName>
  <TaskStatus>Start</TaskStatus>
  <Id>Y/0070/0010</Id>
  <BodyMessage>
    <tva:TVAMain rightsOwner="FAIRY" xmlns:tva="urn:tva:metadata:2004">
        <tva:Colour>red</tva:Colour>
        <tva:Size>12</tva:Size>
        <tva:Style>Skinny</tva:Style>
        <tva:Fabric>Denim</tva:Fabric>
      </tva:TVAMain>
  </BodyMessage>
</ns0:Wrapper>

Когда я пытаюсь извлечь xml из элемента BodyMessage , я получаю неиспользуемые пространства имен, возвращаемые

xmlns:ns0="http://ref.fairyliquidplc.ads/Schema/Fairy/Wrapper/1.0"
xmlns:mco="http://ref.fairyliquidplc.ads/Schema/Fairy/Common/1.0"  

Это не обязательно, но я не понимаю, как удалить их в моем xslt.

Обратите внимание: я DO хочу сохранить

xmlns:tva="urn:tva:metadata:2004"

Используемая таблица стилей:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tva="urn:tva:metadata:2004"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns="http://www.w3.org/1999/xhtml">

<xsl:output encoding="UTF-8" method="xml" omit-xml-declaration="no" version="1.0" />

<xsl:template match="/">

    <xsl:variable name="completeTva" select="//tva:TVAMain" />
    <xsl:copy-of select ="$completeTva"/>

</xsl:template>

вывод таблицы стилей:

<?xml version="1.0" encoding="utf-8"?>
<tva:TVAMain rightsOwner="FAIRY" xmlns:tva="urn:tva:metadata:2004" xmlns:ns0="http://ref.fairyliquidplc.ads/Schema/Fairy/Wrapper/1.0" xmlns:mco="http://ref.fairyliquidplc.ads/Schema/Fairy/Common/1.0">
<tva:Colour>red</tva:Colour>
<tva:Size>12</tva:Size>
<tva:Style>Skinny</tva:Style>
<tva:Fabric>Denim</tva:Fabric>

Что мне требуется:

<?xml version="1.0" encoding="utf-8"?>
<tva:TVAMain rightsOwner="FAIRY" xmlns:tva="urn:tva:metadata:2004">
<tva:Colour>red</tva:Colour>
<tva:Size>12</tva:Size>
<tva:Style>Skinny</tva:Style>
<tva:Fabric>Denim</tva:Fabric>

Любая помощь будет принята с благодарностью.:)

1 Ответ

1 голос
/ 25 января 2012

Это преобразование (Извините, это ошибка в устройстве форматирования кода SO!):

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:tva="urn:tva:metadata:2004"
  xmlns:ns0="http://ref.fairyliquidplc.ads/Schema/Fairy/Wrapper/1.0"
  xmlns:mco="http://ref.fairyliquidplc.ads/Schema/Fairy/Common/1.0"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vtoDiscard" select=
  "document('')
    /*/namespace::*[name()='ns0' or name()='mco']"/>


 <xsl:template match="tva:*">
  <xsl:element  name="{name()}"
                namespace="urn:tva:metadata:2004">
   <xsl:copy-of select="namespace::*[not(. = $vtoDiscard)]"/>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>

 <xsl:template  match="text()[not(ancestor::BodyMessage)]"/>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<ns0:Wrapper
xmlns:ns0="http://ref.fairyliquidplc.ads/Schema/Fairy/Wrapper/1.0" 
xmlns:mco="http://ref.fairyliquidplc.ads/Schema/Fairy/Common/1.0">
  <TaskName>SomeTaskName</TaskName>
  <TaskStatus>Start</TaskStatus>
  <Id>Y/0070/0010</Id>
  <BodyMessage>
    <tva:TVAMain rightsOwner="FAIRY"
    xmlns:tva="urn:tva:metadata:2004">
        <tva:Colour>red</tva:Colour>
        <tva:Size>12</tva:Size>
        <tva:Style>Skinny</tva:Style>
        <tva:Fabric>Denim</tva:Fabric>
      </tva:TVAMain>
  </BodyMessage>
</ns0:Wrapper> 

дает требуемый, правильный результат :

<tva:TVAMain xmlns:tva="urn:tva:metadata:2004" rightsOwner="FAIRY">
   <tva:Colour>red</tva:Colour>
   <tva:Size>12</tva:Size>
   <tva:Style>Skinny</tva:Style>
   <tva:Fabric>Denim</tva:Fabric>
</tva:TVAMain>

Пояснение :

Оба xsl:copy иxsl:copy-of скопировать элемент вместе с принадлежащими ему узлами пространства имен.

Чтобы отделить некоторые узлы пространства имен от элемента, нужно заново создать его с помощью xsl:element, а затем скопировать из оригиналаэлемент только нужные узлы пространства имен.

...