2014-05-02 69 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>