2013-06-30 6 views
0

Входной XML:XSLT: Как извлечь содержимое XML с помощью XSLT переменной

<Resp> 
     <Data><![CDATA[QREMLGBU <?xml version="1.0" encoding="UTF-8" ?><Envelope><Headers><Headers><Body><Response> 
; 
;; 
;;; 
</Response></Body></Envelope> 
</Data> 
</Resp> 

Я хотел бы получить XML из элемента в переменную и извлечь элемент из этой переменной (используя XPATH). (первые 49 символов фиксированы, остальные могут меняться).

<xsl:template match="/"> 
    <xsl:variable name="abc"> 
     <xsl:value-of select="substring(/Resp/Data,49)"/> 
    </xsl:variable> 
</xsl:template> 

Я смог получить значение в переменной аЬс в

<Envelope><Headers><Headers><Body><Response></Response></Body></Envelope> 

, но не в состоянии использовать эту переменную в дальнейшем в качестве XML элемента.

Example: 
<xsl:copy-of select="$abc/Envelope/Body/Response"/> 

Может ли кто-нибудь помочь мне получить выход, как показано ниже.

<Response> 
; 
;; 
;;; 
</Response> 

ответ

3

Поскольку это вложенная XML в разделе CDATA, то XML парсер рассматривает его как единый текстовый узел (CDATA эффективно говорит «игнорировать все здесь, что выглядит как разметке, рассматривать его как текст.»). Поэтому вам нужно извлечь текст в виде строки, а затем передать его другому парсеру, чтобы превратить его в дерево узлов. Нет стандартного способа сделать это до XSLT/XPath 3.0, но некоторые процессоры имеют расширения. С Saxon-PE или выше вы можете использовать функцию XPath 3.0 parse-xml().