Как удалить пространство имен и сохранить только некоторые элементы из исходного документа XML с использованием XSL? - PullRequest
0 голосов
/ 29 сентября 2011

Ниже мой XML. Я хотел разобрать это с помощью XSL. Чего я хочу добиться - это удалить пространство имен (xmlns), а затем просто сохранить некоторые элементы и их атрибуты. Я нашел способ удалить пространство имен, но когда я собрал его вместе с кодом, чтобы сохранить некоторые элементы, он не работает. Я уже попробовал идентичность, но все еще не работал.

Я надеюсь, что кто-то может поделиться чем-то. Заранее большое спасибо.

Ввод XML:

<Transaction xmlns="http://www.test.com/rdc.xsd">
    <Transaction>
       <StoreName id="aa">STORE A</StoreName>
       <TransNo>TXN0001</TransNo>
       <RegisterNo>REG001</RegisterNo>
       <Items>
          <Item id="1">
             <ItemID>A001</ItemID>
             <ItemDesc>Keychain</ItemDesc>
          </Item>
          <Item id="2">
             <ItemID>A002</ItemID>
             <ItemDesc>Wallet</ItemDesc>
          </Item>
       </Items>
       <IDONTLIKETHIS_1>
          <STOREXXX>XXX-</STOREXXX>
          <TRANSXXX>YYY</TRANSXXX>
       </IDONTLIKETHIS_1>
       <IDONTLIKETHIS_2>
          <STOREXXX>XXX-</STOREXXX>
          <TRANSXXX>YYY</TRANSXXX>
       </IDONTLIKETHIS_2>
    </Transaction>
<Transaction>

Ожидаемый вывод XML:

<Transaction>
    <Transaction>
       <StoreName id="aa">STORE A</StoreName>
       <TransNo>TXN0001</TransNo>
       <RegisterNo>REG001</RegisterNo>
       <Items>
          <Item id="1">
             <ItemID>A001</ItemID>
             <ItemDesc>Keychain</ItemDesc>
          </Item>
          <Item id="2">
             <ItemID>A002</ItemID>
             <ItemDesc>Wallet</ItemDesc>
          </Item>
       </Items>
    </Transaction>
<Transaction>

Код, используемый для удаления пространства имен (xmlns):

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

<xsl:template match="@*">
   <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
   </xsl:attribute>
</xsl:template>

1 Ответ

1 голос
/ 29 сентября 2011
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:x="http://invia.fujitsu.com/RetailDATACenter/rdc.xsd">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

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

     <xsl:template match="node()[not(self::*)]">
      <xsl:copy-of select="."/>
     </xsl:template>

     <xsl:template match="x:IDONTLIKETHIS_1 | x:IDONTLIKETHIS_2"/>
</xsl:stylesheet>

Объяснение :

  1. Шаблон, соответствующий "*", соответствует любому элементу и воссоздает его (<xsl:element>) сто же имя, но не копирует узлы пространства имен.Также копирует все атрибуты этого элемента.Затем он применяет шаблоны (включая себя - рекурсивно) ко всем дочерним узлам этого элемента - не только к элементам, но и ко всем типам дочерних узлов: элементам, текстовым узлам, инструкциям по обработке и комментариям.

  2. Последний шаблон соответствует любому узлу, который мы не хотим копировать в выходные данные , и делает это точно (без копирования) с пустым телом шаблона.

  3. Второй шаблон сопоставляет и копирует на выход все узлы, которые не являются элементами, за исключением узла документа /

...