2017-02-13 64 views
0

我源XSD爲XSL轉換:轉化字符串(在XML的形式),以XML元素

<?xml version= '1.0' encoding= 'UTF-8' ?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.quo.com" 
      targetNamespace="http://www.quo.com" 
      elementFormDefault="qualified" 
      xmlns:emc="http://www.quo.com" 
<xsd:complexType name="HeaderType"> 
    <xsd:sequence> 
    <xsd:element name="messageId" type="xsd:string"/> 
    <xsd:element name="messageType" type="xsd:string"/> 
    </xsd:sequence> 
    <xsd:attribute name="version" type="xsd:int"/> 
</xsd:complexType> 
<xsd:complexType name="ResponseType"> 
    <xsd:sequence> 
    <xsd:element name="errorCode" type="xsd:string"/> 
    <xsd:element name="errorString" type="xsd:string"/> 
    </xsd:sequence> 
</xsd:complexType> 
<xsd:element name="AckMessage"> 
    <xsd:complexType> 
    <xsd:sequence> 
    <xsd:element name="header" type="HeaderType"/> 
    <xsd:element name="payload" type="xsd:string"/> 
    </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 
<xsd:element name="response" type="ResponseType"/> 
</xsd:schema> 

我的樣本XML爲源XSD是:

<AckMessage> 
<header version="1"> 
<messageId>messageId1</messageId> 
<messageType>sourceSystemId2</messageType> 
</header> 
<payload> 
    <bookstore> 
    <book> 
    <title lang="en">Harry Potter</title> 
    <author>J K Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
    </book> 
    <book> 
    <title lang="en">Harry Potter 1</title> 
    <author>J K Rowling</author> 
    <year>2006</year> 
    <price>29.99</price> 
    </book> 
    </bookstore> 
</payload> 
</AckMessage> 

在源XSD有效負載元件是字符串類型,其中我得到根元素書店的整個XML片段

我的目標XSD用於XSL轉換:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.quo.com/ns/bookstore" 
      targetNamespace="http://www.quo.com/ns/bookstore" 
      elementFormDefault="qualified"> 
    <xsd:element name="bookstore"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="book" maxOccurs="unbounded"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="title"> 
       <xsd:complexType> 
        <xsd:simpleContent> 
        <xsd:extension base="xsd:string"> 
         <xsd:attribute name="lang" type="xsd:string"/> 
        </xsd:extension> 
        </xsd:simpleContent> 
       </xsd:complexType> 
       </xsd:element> 
       <xsd:element name="author" type="xsd:string"/> 
       <xsd:element name="year" type="xsd:integer"/> 
       <xsd:element name="price" type="xsd:float"/> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

我想將Payload元素從源轉換爲目標模式的bookstore元素。

當我試圖通過簡單的轉換來完成時,出現無法將簡單元素轉換爲XML元素的錯誤。

我試過的xsl:

<xsl:variable name="variable1"> 
    <xsl:value-of select="/msg_in_out:esbAckMessage/msg_in_out:payload" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/> 
    </xsl:variable> 
    <xsl:template match="/"> 
    <imp1:bookstore> 
      <xsl:value-of select="$variable1"/> 
    </imp1:bookstore> 
    </xsl:template> 
</xsl:stylesheet> 

但我正在逐漸爲

<?xml version = '1.0' encoding = 'UTF-8'?> 
<imp1:bookstore xmlns:imp1="http://www.quo.com/ns/bookstore"> 


     Harry Potter 
     J K Rowling 
     2005 
     29.99 


     Harry Potter 1 
     J K Rowling 
     2006 
     29.99 


    </imp1:bookstore> 

我怎樣才能得到有效載荷元素中的一切與XML標籤輸出?

答案是使用複製的

<xsl:variable name="variable1"> 
    <xsl:value-of select="/msg_in_out:esbAckMessage/msg_in_out:payload" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/> 
    </xsl:variable> 
    <xsl:template match="/"> 
    <imp1:bookstore> 
      <xsl:copy-of select="$variable1"/> 
    </imp1:bookstore> 
    </xsl:template> 
</xsl:stylesheet> 
+0

哪裏是你的XSL文件?請顯示所有相關代碼。 – OldProgrammer

+0

如果模式很重要,那麼請顯示有效的實例,使用目標命名空間顯示模式但不使用任何命名空間的實例文檔是沒有意義的。當然,如果你告訴我們'payload'元素是字符串類型,那麼你所說的輸入示例根本沒有意義,它可能需要轉義標記或CDATA部分。 –

+0

您好Martin,我的示例xml是有效的,我正在使用Oracle SOA for webservice,所以我的websrvice接受源XSD的示例XML,然後在BPEL流程中使用Xsl將「有效內容」值傳遞給目標元素Bookstore。 – user5568021

回答

0

答案是使用複製的

<xsl:variable name="variable1"> 
    <xsl:value-of select="/msg_in_out:esbAckMessage/msg_in_out:payload" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/> 
    </xsl:variable> 
    <xsl:template match="/"> 
    <imp1:bookstore> 
      <xsl:copy-of select="$variable1"/> 
    </imp1:bookstore> 
    </xsl:template> 
</xsl:stylesheet>