2014-05-02 40 views
0
添加所有的开始和结束标记到输出

假设我有一个这样的XML:使用XSLT

<?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> 

我想捕获所有改变要素但是一切都应该被打印出来,以及包括打开和关闭标签属性所以输出应该是这样的:

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

注意

  1. 我要输出所有标签( 都开始和结束标记圣坛元素中的属性)以及文本
  2. 标签可以被改变和决定应根据标签的名字,因为他们都是自动生成的和动态
  3. 一个ALTER元素内的标签名称可以是从加入到另一个的alter元件像上述代码的不同:

第一ALTER具有

<x></x> 

<y role=''></y> 

而第二ALTER具有

<w></w> 

<z role=''><z> 

而第三ALTER可以有别的东西和...。

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

编辑:基于@Mads汉森的解决方案

,输出将是:

<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> 

的问题是,所有的命名空间已添加到外港,以及这是不期望。

有什么办法摆脱所有的命名空间?

+0

请求的输出(以及你现在得到的输出)是无效的XML:你必须有一个根元素。 –

+0

然而,输出应该包含所有标签,它不应该是XML输出(即XML文件),因此不需要具有根标签以及<?xml version =“1.0”encoding =“UTF-8 “?> – Azi

+0

那么也许你应该输出这个*文本*,遵循一些预定义模式 - 而不关心打开和关闭标签。无根输出XML的问题在于某些处理器将全部放在一行上。这个练习的总体目的是什么? –

回答

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>