2016-04-28 89 views
0

我必須使用XSLT轉換我的輸入xml。 它包含CDATA和我需要從CDATA中提取元素,然後我必須重命名標記。XSLT轉換和CDATA

下面是我輸入的xml:

<getArtifactContentResponse> 
     <return> 
      <![CDATA[ 
     <metadata> 
     <overview>   
      <name>scannapp</name> 
      <developerId>developer702</developerId> 
      <stateId>2</stateId> 
      <serverURL>dddd</serverURL> 
      <id>cspapp1103</id> 
      <description>scann doc</description> 
      <hostingTypeId>1</hostingTypeId> 
    </overview> 
    </metadata> 
     ]]> 
     </return> 
    </getArtifactContentResponse> 

和預期的輸出結果是:我使用

<?xml version="1.0" encoding="UTF-8"?> 
    <metadata > 
    <information>   
     <name>scannapp</name> 
     <developerId>developer702</developerId> 
     <stateId>2</stateId> 
     <serverURL>ddddd</serverURL> 
     <id>cspapp1103</id> 
     <description>scann doc</description> 
     <hostingTypeId>1</hostingTypeId>   
    </Information> 
</metadata> 

XSLT低於:

<xsl:output method="xml" version="1.0" encoding="UTF-8" /> 
<xsl:template match="/"> 
    <xsl:value-of select="//ns:getArtifactContentResponse/ns:return/text()" disable-output-escaping="yes"/> 
</xsl:template> 


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

有了這個我能夠表達我的意見CDATA,但它不會將元素「overview」重命名爲「Information」。

轉化XML如下:

<?xml version="1.0" encoding="UTF-8"?> 

    <metadata> 
    <overview>   
     <name>scannapp</name> 
     <developerId>developer702</developerId> 
     <stateId>2</stateId> 
     <serverURL>dddddd</serverURL> 
     <id>cspapp1103</id> 
     <description>scann doc</description> 
     <hostingTypeId>1</hostingTypeId>   
    </overview> 
</metadata> 

誰能告訴我怎樣才能提取CDATA後重命名標籤? 我不明白我在這裏失蹤了什麼?

在此先感謝

+2

如果您只有XSLT版本1.0可用,則需要在最初的XSLT輸出上運行另一個XSLT以生成所需的輸出。 CData的內容被視爲純文本,因此無法像XSLT一樣處理正常的XML片段。 – har07

+1

相關:1. [轉換內容在CDATA中的xml元素](http://stackoverflow.com/questions/2067116/convert-an-xml-element-whose-content-is-inside-cdata),2。 [使用XSL從CDATA轉換XML](http://stackoverflow.com/questions/18612639/transform-xml-from-cdata-using-xsl) – har07

+0

對我不清楚。你能用上面的例子來解釋一下嗎? – krishh

回答

0

CDATA中沒有元素,只有文本。這就是CDATA的意思:「這個東西看起來像標記,但我希望它被看作是文本」。

將文本轉換爲元素稱爲解析,因此要從CDATA中的文本中提取元素,您將不得不解析它。在XSLT 3.0(具有parse-xml()函數)之前,沒有直接的方法可以在XSLT中執行此操作。一些XSLT處理器具有擴展功能,在一些(我相信)exslt:node-set()函數做這個,如果你提供一個字符串作爲輸入。與其他人一樣,您可以調用自己的Java或Javascript代碼來進行解析。所以這一切都變得依賴於處理器。

另一種方法是使用disable-output-escaping技巧在CDATA節中輸出XML,然後在第二次轉換中處理它。

最好的方法是在開始之前擺脫CDATA標籤。他們本來不應該放在那裏。