2017-01-23 3 views
0

Это мой первый раз с использованием .xsl, поэтому это должен быть простой вопрос.Преобразование XML с XSL производит простой текстовый вывод

У меня есть этот XML

<?xml version="1.0" encoding="UTF-8"?> 
<PublishTESTWS1ASSET xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2017-01-22T20:07:28-08:00" transLanguage="EN" baseLanguage="EN" messageID="3649776.1485144448726917270" maximoVersion="7 6 20141117-2230 V7600-218" event="0"> 
    <TESTWS1ASSETSet> 
     <ASSET> 
     <ASSETID>52</ASSETID> 
     <ASSETNUM>1001</ASSETNUM> 
     <DESCRIPTION>Fire Extinguisher</DESCRIPTION> 
     </ASSET> 
    </TESTWS1ASSETSet> 
</PublishTESTWS1ASSET> 

И у меня есть этот .xsl

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tes="http://testws1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="PublishTESTWS1ASSET/TESTWS1ASSETSet"> 
     <xsl:apply-templates select="ASSET"/> 
    </xsl:template> 
    <xsl:template match="ASSET"> 
     <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tes="http://testws1/"> 
     <soapenv:Header/> 
     <soapenv:Body> 
      <tes:addAsset> 
       <name><xsl:value-of select="DESCRIPTION"/></name> 
       <number><xsl:value-of select="ASSETID"/></number> 
      </tes:addAsset> 
     </soapenv:Body> 
     </soapenv:Envelope> 
    </xsl:template> 
</xsl:stylesheet> 

Когда это трансформируется она тушит следующее в виде обычного текста

 52 
    1001 
    Fire Extinguisher 

Я сузил его до атрибута в PublishTESTWS1ASSET

xmlns="http://www.ibm.com/maximo" 

Снятие, что производит правый выход

<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:tes="http://testws1/" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tes:addAsset> 
     <name>Fire Extinguisher</name> 
     <number>52</number> 
     </tes:addAsset> 
    </soapenv:Body> 
</soapenv:Envelope> 

Может кто-нибудь объяснить мне, почему это происходит и как это исправить, не изменяя исходный XML-документ

+0

Искать «XSLT default namespace», и вы найдете 574 ответа на этот же вопрос. –

ответ

1

Вы не совпадающий с пространством имен в XSLT; без этого шаблоны, которые вы написали, не будут соответствовать элементам ввода XML. И причина, по которой вы получаете какой-то результат, - это встроенные шаблоны, которые обрабатывают ваш входной XML.

Вам необходимо объявить пространство имен (и префикс, необязательно) в XSLT и использовать их для соответствия элементам. Пожалуйста, обратитесь код ниже:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tes="http://testws1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="http://www.ibm.com/maximo"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="ns:PublishTESTWS1ASSET/ns:TESTWS1ASSETSet"> 
     <xsl:apply-templates select="ns:ASSET"/> 
    </xsl:template> 
    <xsl:template match="ns:ASSET"> 
     <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tes="http://testws1/"> 
     <soapenv:Header/> 
     <soapenv:Body> 
      <tes:addAsset> 
       <name><xsl:value-of select="ns:DESCRIPTION"/></name> 
       <number><xsl:value-of select="ns:ASSETID"/></number> 
      </tes:addAsset> 
     </soapenv:Body> 
     </soapenv:Envelope> 
    </xsl:template> 
</xsl:stylesheet> 

В XSLT выше, пространство имен http://www.ibm.com/maximo объявляется с префиксом ns. А в остальной части XPATH, чтобы соответствовать элементам, используется один и тот же префикс.

Смежные вопросы