2015-02-20 3 views
0

Я использую веб-службу, которая возвращает экранированный XML. Мне нужно уклониться от него и сделать на нем трансформацию. Я пытаюсь выяснить, как сделать это в один преобразование, учитывая, что я получаю эту ошибку:Ошибка типа при использовании as = "element" для переменной

Required item type of value of variable $result is element(); supplied value has item type text()

с этим XML:

<MyServiceResponse> 
    <MyServiceResult>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; 
&lt;vector&gt;&lt;num&gt;1100070561&lt;/num&gt;&lt;/vector&gt;</MyServiceResult> 
</MyServiceResponse> 

с помощью этой таблицы стилей:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0" exclude-result-prefixes="xs"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <xsl:template match="/MyServiceResponse"> 
     <xsl:variable name="result" as="element()">   
      <xsl:value-of select="MyServiceResult" disable-output-escaping="yes"/> 
     </xsl:variable> 
     <CustomerID xmlns="http://myURL.com"> 
      <xsl:value-of select="$result/*"/> 
     </CustomerID> 
    </xsl:template> 
</xsl:stylesheet> 

Я использую Saxon-EE 9.6.0.4J

ответ

1

Хорошо с Saxon EE у вас есть полный доступ к XSLT 3.0 или к расширению расширения Саксона ns http://saxonica.com/html/documentation/functions/saxon/parse.html, поэтому я просто проанализирую результат, например. <xsl:variable name="result" select="saxon:parse(MyServiceResult)" xmlns:saxon="http://saxon.sf.net/"/>. Это даст вам узел документа, который затем выведет его содержащиеся узлы, например. <xsl:copy-of select="$result/node()"/>.

+0

Большое спасибо. И саксон: parse() и parse-xml() отлично работали. Я пошел с последним, поскольку он является частью спецификации 3.0. Моя первая таблица стилей 3.0! ;-) – johkar