#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
.
.