XSLT-трансформация для исходящего трафика не работает - PullRequest
0 голосов
/ 09 апреля 2020

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

Файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<PublishITEM xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema- 
instance" creationDateTime="2020-02-25T11:12:05+01:00" transLanguage="EN" baseLanguage="EN" 
messageID="318921582625525794116" maximoVersion="7 6 20190514-1348 V7611-365" event="1">
   <ITEMSet>
     <ITEM action="Add">
       <ATTACHONISSUE>0</ATTACHONISSUE>
     </ITEM>
     <ITEM action="Add">
       <ATTACHONISSUE>1</ATTACHONISSUE>
     </ITEM>
   </ITEMSet>
 </PublishITEM>

Я сделал XSL-преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result- 
prefixes="mea" 
xmlns:mea="http://www.ibm.com/maximo">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml- 
declaration="yes"/> 
<xsl:template match="/">
<xsl:apply-templates select="mea:PublishITEM"/>
</xsl:template>

<xsl:template match="mea:PublishITEM">
<xsl:apply-templates select="mea:ITEMSet"/>
</xsl:template>

<xsl:template match="mea:ITEMSet">
<xsl:apply-templates select="mea:ITEM"/>
</xsl:template>

<xsl:template match="mea:ITEM">
<PARAM>
<xsl:apply-templates select="mea:ATTACHONISSUE"/>

</PARAM>
</xsl:template>

<xsl:template match="mea:ATTACHONISSUE">
<CD-NAME><xsl:value-of select="."/></CD-NAME>
</xsl:template>
</xsl:stylesheet>

Я не понимаю, что делаю неправильно. Я пробовал разные онлайн-сайты для тестирования. Одна из полученных мной ошибок: Нет таблиц стилей, связанных с этим объектом

Не забудьте упомянуть желаемый результат:

<PARAM>
<CD-NAME>0</CD-NAME>
</PARAM>
<PARAM>
<CD-NAME>1</CD-NAME>
</PARAM>

Также возможно иметь если? например .. если значение 0 в outpu положить false, если это 1 true? Я также добавил XSL с предложенными исправлениями

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Для начала удалите завершающий символ / в:

<xsl:apply-templates select="mea:PublishITEM/"/>

и:

<xsl:apply-templates select="mea:ITEMSet/"/>  

и:

<xsl:apply-templates select="mea:ITEM/"/>

Далее вы захочет удалить оболочку <PARAM> из одного из двух шаблонов, которые ее выводят. А также добавьте атрибут exclude-result-prefixes="mea" к вашему элементу xsl:stylesheet.


Конечно, вы можете сократить все до всего:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:mea="http://www.ibm.com/maximo"
exclude-result-prefixes="mea">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/> 

<xsl:template match="/mea:PublishITEM">
    <PARAM>
        <CD-NAME>
            <xsl:value-of select="mea:ITEMSet/mea:ITEM/mea:ATTACHONISSUE"/>
        </CD-NAME>
    </PARAM>
</xsl:template>

</xsl:stylesheet>

(при условии, что всегда будет быть только одним ATTACHONISSUE элементом на входе XML).

1 голос
/ 09 апреля 2020

У вас есть много шаблонов, которые можно опустить, просто используя шаблоны по умолчанию:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:mea="http://www.ibm.com/maximo" exclude-result-prefixes="mea">

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

<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/> 

<xsl:template match="mea:ITEM">
    <PARAM>
    <xsl:apply-templates select="mea:ATTACHONISSUE"/>
    </PARAM>
</xsl:template>

<xsl:template match="mea:ATTACHONISSUE">
    <CD-NAME><xsl:value-of select="."/></CD-NAME>
</xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/pNmC4HW

...