2017-02-13 14 views
0

My Источник XSD для преобразования XSL:Преобразование String (в виде 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 является string, в котором я получаю весь фрагмент XML для книжного магазина корневого элемента

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

Я хочу преобразовать элемент полезной нагрузки из источника в элемент 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> 

Как я могу получить все, что внутри Payload элемента с 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 для webservice, поэтому My websrvice принимает образец XML для исходного XSD, а затем я использую Xsl в BPEL-процессе, чтобы передать значение «полезной нагрузки» целевому элементу 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>