Как применить несколько шаблонов в xslt?Первая часть xslt используется для удаления пространств имен и префиксов.Вторая часть используется для преобразования атрибута (смещение) в новый элемент.
Пример ввода XML
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns3:getResponse xmlns="https://dataservices.ipt.com/scheduleRequest" xmlns:ns2="https://dataservices.ipt.com/ScheduleResult" xmlns:ns3="https://dataservices.ipt.com/Schedules" xmlns:ns4="https://dataservices.ipt.com/xsd/inf">
<ns2:ScheduleResult as-of-date="2018-010-11T14:09:46.083Z">
<ns2:Schedules>
<ns2:ScheduleKeys>
<ns2:ScheduleID>ABCD</ns2:ScheduleID>
<ns2:SourceSystemName Offset="GMT6">Cloud_1</ns2:SourceSystemName>
</ns2:ScheduleKeys>
</ns2:Schedules>
</ns2:ScheduleResult>
</ns3:getResponse>
</S:Body>
</S:Envelope>
Требуемый вывод
<?xml version="1.0" encoding="utf-8"?>
<Envelope>
<Body>
<getResponse>
<ScheduleResult as-of-date="2018-010-11T14:09:46.083Z">
<Schedules>
<ScheduleKeys>
<ScheduleID>ABCD</ScheduleID>
<SourceSystemName>
<SystemName>Cloud_1</SystemName>
<Offset>GMT6</Offset>
</SourceSystemName>
</ScheduleKeys>
</Schedules>
</ScheduleResult>
</getResponse>
</Body>
</Envelope>
попытка XSLT
Обратите внимание, что при запуске первой части xslt пространства имен и префиксы удаляются по желанию.Также, когда вторая часть XSLT запускается сама по себе, Атрибут для нового элемента обрабатывается правильно.Однако при объединении двух частей XSLT (как показано здесь) работает только вторая часть.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<!-- Remove all namespaces and prefixes -->
<xsl:template match="*">
<xsl:element name="{local-name(.)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<!-- Convert any elements with Offset -->
<!-- From -->
<!-- <SourceSystemName Offset="GMT6">Cloud_1</SourceSystemName> -->
<!-- To -->
<!-- <SourceSystemName> -->
<!-- <SystemName>Cloud_1</SystemName> -->
<!-- <Offset>GNT6</WeightUOM> -->
<!-- </SourceSystemName -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[@Offset]/text()" />
<xsl:template match="@Offset">
<SystemName>
<xsl:value-of select="../text()"/>
</SystemName>
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Сгенерированный вывод из XSLT
К сожалению, тольковторая половина XSLT работает.
<?xml version="1.0" encoding="utf-8"?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns3:getResponse xmlns:ns3="https://dataservices.ipt.com/Schedules" xmlns="https://dataservices.ipt.com/scheduleRequest" xmlns:ns2="https://dataservices.ipt.com/ScheduleResult" xmlns:ns4="https://dataservices.ipt.com/xsd/inf">
<ns2:ScheduleResult as-of-date="2018-010-11T14:09:46.083Z">
<ns2:Schedules>
<ns2:ScheduleKeys>
<ns2:ScheduleID>ABCD</ns2:ScheduleID>
<ns2:SourceSystemName>
<SystemName xmlns="">Cloud_1</SystemName>
<Offset xmlns="">GMT6</Offset>
</ns2:SourceSystemName>
</ns2:ScheduleKeys>
</ns2:Schedules>
</ns2:ScheduleResult>
</ns3:getResponse>
</S:Body>
</S:Envelope>