У меня есть SOAP звонок, возвращающий следующее:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> <soapenv:Body> <ns:getTenantResponse xmlns:ns="http://services.mgt.tenant.carbon.wso2.org"> <ns:return xsi:type="ax2696:TenantInfoBean" xmlns:ax2696="http://beans.common.stratos.carbon.wso2.org/xsd" xmlns:ax2698="http://exception.common.stratos.carbon.wso2.org/xsd" xmlns:ax2700="http://api.user.carbon.wso2.org/xsd" xmlns:ax2702="http://beans.mgt.tenant.carbon.wso2.org/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ax2696:active>true</ax2696:active> <ax2696:admin>admin</ax2696:admin> <ax2696:adminPassword xsi:nil="true"/> <ax2696:createdDate>2020-03-31T18:05:30.321-03:00</ax2696:createdDate> <ax2696:email>erico@mail.com</ax2696:email> <ax2696:firstname>erico</ax2696:firstname> <ax2696:lastname>mtx</ax2696:lastname> <ax2696:originatedService xsi:nil="true"/> <ax2696:successKey xsi:nil="true"/> <ax2696:tenantDomain>dom20.com</ax2696:tenantDomain> <ax2696:tenantId>1</ax2696:tenantId> <ax2696:usagePlan/> </ns:return> </ns:getTenantResponse> </soapenv:Body> </soapenv:Envelope>
Мне нужно обработать возврат через посредник XSLT в WSO2 Enterprise Integrator 6.6.0.
Некоторые из атрибуты возвращаются с содержанием:
xsi:nil="true"
Мне нужен мой посредник, чтобы заменить эти теги пустыми значениями для моих атрибутов.
Мой текущий посредник имеет следующие значения:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"> <xsl:output omit-xml-declaration="no" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="*[@xsi:nil = 'true']" /> </xsl:stylesheet>
Вывод выглядит следующим образом:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> <soapenv:Body> <ns:getTenantResponse xmlns:ns="http://services.mgt.tenant.carbon.wso2.org"> <ns:return xsi:type="ax2696:TenantInfoBean" xmlns:ax2696="http://beans.common.stratos.carbon.wso2.org/xsd" xmlns:ax2698="http://exception.common.stratos.carbon.wso2.org/xsd" xmlns:ax2700="http://api.user.carbon.wso2.org/xsd" xmlns:ax2702="http://beans.mgt.tenant.carbon.wso2.org/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ax2696:active>true</ax2696:active> <ax2696:admin>admin</ax2696:admin> <ax2696:adminPassword xsi:nil="true"/> <ax2696:createdDate>2020-03-31T18:05:30.321-03:00</ax2696:createdDate> <ax2696:email>erico@skalena.com</ax2696:email> <ax2696:firstname>erico</ax2696:firstname> <ax2696:lastname>teixeira</ax2696:lastname> <ax2696:originatedService xsi:nil="true"/> <ax2696:successKey xsi:nil="true"/> <ax2696:tenantDomain>dom20.com</ax2696:tenantDomain> <ax2696:tenantId>1</ax2696:tenantId> <ax2696:usagePlan/> </ns:return> </ns:getTenantResponse> </soapenv:Body> </soapenv:Envelope>
Как пример:
<ax2696:successKey xsi:nil="true"/>
Мне нужно, чтобы он стал:
<ax2696:successKey></ax2696:successKey>
Мне нужно сделать это для большинства атрибутов не только successKey
Thks
Ваш шаблон соответствует любому элементу, который имеет атрибут xsi:nil="true", и удаляет его. Если вы хотите удалить только сам атрибут, сделайте его:
<xsl:template match="@xsi:nil[. = 'true']" />
Обновленный ответ
Если вы хотите удалить все @xsi: nil = 'true'
<xsl:template match="@xsi:nil"/>
Если вы хотите удалить @xsl: nil = 'true' только на определенных узлах
<xsl:template match="@xsi:nil[local-name(parent::*) = 'originatedService']"/>
См. пример здесь: https://xsltfiddle.liberty-development.net/pNmC4J4/1
Оригинальный ответ
Не уверен, что я действительно понимаю ваш вопрос. Это то, что вы пытаетесь достичь?
Заменить
<!-- TEMPLATE #2 --> <xsl:template match="*[@xsi:nil = 'true']" />
На
<!-- TEMPLATE #2 --> <xsl:template match="@xsi:nil[. = 'true']"> <xsl:attribute name="nil" namespace="http://www.w3.org/2001/XMLSchema-instance"/> </xsl:template>
Посмотрите, как это работает здесь: https://xsltfiddle.liberty-development.net/pNmC4J4