Неправильный вывод в пространстве имен XML в элементе

#xml #xslt #namespaces

#xml #xslt #пространства имен

Вопрос:

Недавно я задал вопрос о неправильном выводе XML, который оказался неправильным, оказалось, что это связано с тем, что пространство имен было помещено в элемент.

Теперь я изучил это подробнее, и, к сожалению, я все еще застреваю на выходе, потому что я не знаю точно, с какими префиксами теперь.

Надеюсь, вы сможете мне помочь.

Ниже приведены файлы, которые у меня есть сейчас, и выходные данные, которые я хотел бы иметь.

Мой входной XML:

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <ns2:readAllAMDResV04 xmlns:ns2="http://main.jws.com.hanel.de">
         <ns2:return>
            <article xmlns="http://main.jws.com.hanel.de/xsd">
               <articleNumber>Aadrapot99900</articleNumber>
               <articleName/>
               <inventoryAtStorageLocation>2</inventoryAtStorageLocation>
            </article>
            <article xmlns="http://main.jws.com.hanel.de/xsd">
               <articleNumber>Aadrapot99900</articleNumber>
               <articleName/>
               <inventoryAtStorageLocation>7</inventoryAtStorageLocation>
            </article>
            <article xmlns="http://main.jws.com.hanel.de/xsd">
               <articleNumber>Ae13963</articleNumber>
               <articleName/>
               <inventoryAtStorageLocation>128</inventoryAtStorageLocation>
             </article>
            <article xmlns="http://main.jws.com.hanel.de/xsd">
               <articleNumber>PCM11512050E</articleNumber>
               <articleName/>
               <inventoryAtStorageLocation>68</inventoryAtStorageLocation>
            </article>
            <ns1:returnValue xmlns:ns1="http://main.jws.com.hanel.de/xsd">0</ns1:returnValue>
         </ns2:return>
      </ns2:readAllAMDResV04>
   </soapenv:Body>
</soapenv:Envelope>
 

Мой XSLT:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:abc="main.jws.com.hanel.de/xsd"
exclude-result-prefixes="abc"
version="1.0" >
    <xsl:key name="key" match="article" use="articleNumber"/>
    <xsl:template match="/articles">
        <result>
            <xsl:apply-templates select="article[generate-id() = generate-id(key('key', articleNumber)[1])]"/>
        </result>
    </xsl:template>

    <xsl:template match="article">
        <count>
            <articleNumber><xsl:value-of select="articleNumber"/></articleNumber>
            <totalQuantity><xsl:value-of select="sum(key('key', articleNumber)/inventoryAtStorageLocation)"/></totalQuantity>
        </count>
    </xsl:template>
</xsl:stylesheet>
 

Мой вывод до сих пор:

       Aadrapot99900
       
       2
    
    
       Aadrapot99900
       
       7
    
    
       Ae13963
       
       128
 

Вывод, который я ищу:

 <?xml version="1.0" encoding="utf-8"?>
<DataSet>
    <article>
       <articleNumber>Aadrapot99900</articleNumber>
       <totalQuantity>9</totalQuantity>
    </article>
    <article>
       <articleNumber>Ae13963</articleNumber>
       <totalQuantity>128</totalQuantity>
    </article>
</DataSet>
 

Я думаю, что мне нужно где-то добавить префикс abc, но не знаю, где именно, и я не уверен в совпадении ключевых результатов.

Заранее спасибо!

Ответ №1:

Это:

 <xsl:template match="/articles">
 

не может работать, потому articles что в вашем вводе нет элемента с именем — и, конечно, не корневого элемента.

Попробуйте изменить его на:

 <xsl:template match="ns2:return">
 

после добавления xmlns:ns2="http://main.jws.com.hanel.de" объявления. И вы, вероятно, захотите добавить:

 <xsl:strip-space elements="*"/>
 

в верхней части таблицы стилей.


Это:

 xmlns:abc="main.jws.com.hanel.de/xsd"
 

неверно. Фактическое пространство имен отличается. Это должно быть:

 xmlns:abc="http://main.jws.com.hanel.de/xsd"
 

Как только вы это исправите, измените все ссылки на article на abc:article . Аналогично для его потомков articleNumber и inventoryAtStorageLocation .

.