ниже вводится xml:
<ns:TXLife xmlns:ns="http://ACORD.org/Standards/Life/2"> <TXLifeResponse> <TransRefGUID/> <TransExeDate/> <TransExeTime/> <TransType tc="228"/> </ns:TXLife>
и ниже мой XSLT:
xmlns:ns="http://ACORD.org/Standards/Life/2" version="1.0"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acor="http://www.foresters.com/esb/ws/wsdl/ACORD-v1.0" xmlns:ns="http://ACORD.org/Standards/Life/2"> <soapenv:Header/> <soapenv:Body> <xsl:copy> <xsl:apply-templates /> </xsl:copy> </soapenv:Body> </soapenv:Envelope> </xsl:template> <xsl:template match="node() [local-name(.) = 'TXLife']"> <xsl:element name="ns:{local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template>
С помощью этого преобразования я не могу добавить префикс пространства имен ко всем дочерним элементам TXLife.
как добавить префикс пространства имен (ns) ко всем дочерним элементам? чтобы он выглядел так, как показано ниже
<ns:TXLifeResponse> <ns:TransRefGUID/> <ns:TransExeDate/> <ns:TransExeTime/> <ns:TransType tc="228"/> </ns:TXLife>
Если вы хотите, чтобы only TXLife и потомок находились под http://ACORD.org/Standards/Life/2 пространством имен, используйте эту таблицу стилей:
TXLife
http://ACORD.org/Standards/Life/2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://ACORD.org/Standards/Life/2" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <xsl:template match="/"> <soapenv:Envelope> <soapenv:Header/> <soapenv:Body> <xsl:apply-templates/> </soapenv:Body> </soapenv:Envelope> </xsl:template> <xsl:template match="*[ancestor-or-self::ns:TXLife]"> <xsl:element name="ns:{local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Выход:
<soapenv:Envelope xmlns:ns="http://ACORD.org/Standards/Life/2" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header /> <soapenv:Body> <ns:TXLife> <ns:TXLifeResponse> <ns:TransRefGUID></ns:TransRefGUID> <ns:TransExeDate></ns:TransExeDate> <ns:TransExeTime></ns:TransExeTime> <ns:TransType tc="228"></ns:TransType> </ns:TXLifeResponse> </ns:TXLife> </soapenv:Body> </soapenv:Envelope>
Ваш XML недействителен, но я предполагаю, что вы только что пропустили закрывающий элемент TXLifeResponse.
TXLifeResponse
Следующее преобразование будет делать то, что вы хотите:
XML:
<?xml version="1.0" encoding="UTF-8"?> <ns:TXLife xmlns:ns="http://ACORD.org/Standards/Life/2"> <TXLifeResponse> <TransRefGUID/> <TransExeDate/> <TransExeTime/> <TransType tc="228"/> </TXLifeResponse> </ns:TXLife>
XSLT:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ns="http://ACORD.org/Standards/Life/2"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acor="http://www.foresters.com/esb/ws/wsdl/ACORD-v1.0" xmlns:ns="http://ACORD.org/Standards/Life/2"> <soapenv:Header/> <soapenv:Body> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </soapenv:Body> </soapenv:Envelope> </xsl:template> <xsl:template match="*"> <xsl:element name="ns:{local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*"> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acor="http://www.foresters.com/esb/ws/wsdl/ACORD-v1.0" xmlns:ns="http://ACORD.org/Standards/Life/2"> <soapenv:Header/> <soapenv:Body> <ns:TXLife> <ns:TXLifeResponse> <ns:TransRefGUID/> <ns:TransExeDate/> <ns:TransExeTime/> <ns:TransType tc="228"/> </ns:TXLifeResponse> </ns:TXLife> </soapenv:Body> </soapenv:Envelope>
Шаблон xsl:template match="node()[local-name(.) = 'TXLife']" для меня несколько странно.Что вы пытаетесь достичь?Может быть, мы можем помочь объяснить, почему это не самый подходящий способ сделать это.
xsl:template match="node()[local-name(.) = 'TXLife']"