使用XSLT将所有打开和关闭标记添加到输出

时间:2014-05-02 01:38:44

标签: xml xslt tags

假设我有一个像这样的Xml:

<?xml version="1.0" encoding="utf-8"?>
 <xsl:output method="xml"  indent="yes" omit-xml-declaration="yes"/>
<root xmlns:dbk="http://K.com"
    xmlns:dbs="http://S.com"
    xmlns:dbp="http://p.com"
    xmlns:dbm="http://z.com" >
   <a>
       This is the first text
       <alter>
             <dbk:x> Hello </dbk:x>
             <dbs:y role='Strong'>World </dbs:y>
      </alter>
  </a>
  <d>
      This is the second text
      <alter>
            <dbp:w> How are </dbp:w>
            <dbm:z role='Italic'>  you? </dbm:z>
      </alter>
  </d>
</root>

我想捕获所有的alter元素但是应该打印出所有内容,包括打开和关闭标签以及属性,所以输出应该是这样的:

<x> Hello </x>
<y role='Strong'>  World </y> 
<w> How are </w>
<z role='Italic'>  you? </z> 

请注意

  1. 我想在alter元素和文本
  2. 中输出所有标记(开始和结束标记属性
  3. 标签可以变化,并且 NOT 的决定应该基于标签的名称,因为它们都是自动生成的并且是动态的
  4. 一个alter元素中的标记名称可以与添加到上面的另一个alter元素的标记不同:
  5. 第一个改变

    <x></x>
    

    <y role=''></y> 
    

    而第二个改变

      <w></w> 
    

      <z role=''><z>
    

    第三个改变可以有别的东西......

    不确定XSLT应该是什么样的?

    编辑:

    基于@Mads Hansen的解决方案,输出将是:

    <dbk:x xmlns:dbk="http://K.com" xmlns:dbs="http://S.com" xmlns:dbp="http://p.com"     xmlns:dbm="http://z.com"> Hello </dbk:x>
    <dbs:y role="Strong" xmlns:dbs="http://S.com" xmlns:dbk="http://K.com" xmlns:dbp="http://p.com" xmlns:dbm="http://z.com">World </dbs:y>
    <dbp:w xmlns:dbp="http://p.com" xmlns:dbk="http://K.com" xmlns:dbs="http://S.com" xmlns:dbm="http://z.com"> How are </dbp:w>
    <dbm:z role="Italic" xmlns:dbm="http://z.com" xmlns:dbk="http://K.com" xmlns:dbs="http://S.com" xmlns:dbp="http://p.com">  you? </dbm:z>
    

    问题是所有命名空间都已添加到outport中,这是不可取的。

    有没有办法摆脱所有命名空间?

1 个答案:

答案 0 :(得分:1)

以下样式表:

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

<xsl:template match="/">
    <output>
        <xsl:apply-templates select="descendant::alter/*"/>
    </output>
</xsl:template>

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

<xsl:template match="@*">
    <xsl:copy/> 
</xsl:template>

</xsl:stylesheet>

应用于您的示例输入时,将产生以下结果:

<output>
   <x> Hello </x>
   <y role="Strong">World </y>
   <w> How are </w>
   <z role="Italic">  you? </z>
</output>

从第一个模板中删除<output>标记将导致XML无效,某些处理器(例如libxslt)可能会将其呈现为:

<x> Hello </x><y role="Strong">World </y><w> How are </w><z role="Italic">  you? </z>