2013-10-14 99 views
1

我需要XML轉換的幫助。我輸入的XML是將XML屬性和元素轉換爲元素

<Book BookType="PAPER" BookID="23456" AuthorCD="578"> my Book Name </Book> 

我需要的輸出格式如下

<Book> 
<BookType>PAPER</BookType> 
<BookID>23456</BookID> 
<AuthorCD>578</AuthorCD> 
<Book>my Book Name </Book> 
</Book> 

我想下面轉型

​​3210

但它放出來快到像下面。如何獲得「我的書名」並未以預期格式顯示。

<Book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <BookType>PAPER</BookType> 
    <BookID>23456</BookID> 
    <AuthorCD>578</AuthorCD> 
    my Book Name 
</<Book> 

回答

0

試試這個

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

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

寫爲Book元素和模板一個其屬性:

<xsl:template mach="Book"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <Book> 
     <xsl:value-of select="."/> 
    </Book> 
    </xsl:copy> 
</xsl:template> 


<xsl:template match="Book/@*"> 
    <xsl:element name="{name()}"> 
    <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:element> 
+0

喜歡它!它更多的是XSLT功能風格,沒有if和for-each –

0

你得到的文字「我的書的名字」輸出,因爲默認模板節點踢入。 默認模板規則的工作方式如下:

  • 獲取屬性和文本節點的文本值
  • 應用已定義的模板(如果沒有定義,則爲默認值)。
  • 忽略註釋和處理指令

根據上面的規則,atrribute名稱和元素名稱不是在輸出被發現。

Learn more about default templates

您的解決方案,以按預期工作,你需要爲文本節點添加圖書元素中的規則:

<xsl:template match="Book/text()"> 
<Book> 
    <xsl:value-of select="."/> 
</Book> 
</xsl:template>