如何使用xslt删除名称空间并更新输出元素
我有一个XML元素,需要使用XSLT将其转换为不同的形式。我已经在下面发布了请求和响应xml。我是XSLT新手,需要帮助将请求转换为响应格式 请求:如何使用xslt删除名称空间并更新输出元素,xslt,cdata,Xslt,Cdata,我有一个XML元素,需要使用XSLT将其转换为不同的形式。我已经在下面发布了请求和响应xml。我是XSLT新手,需要帮助将请求转换为响应格式 请求: <p:ReservationRequest xmlns:p="http://sample.request.com/"> <!--Exactly 1 occurrence--> <p:Reservation> <p:tktReservationGUID>1357
<p:ReservationRequest xmlns:p="http://sample.request.com/">
<!--Exactly 1 occurrence-->
<p:Reservation>
<p:tktReservationGUID>13579</p:tktReservationGUID>
<p:tktState>CA</p:tktState>
<p:LocationId>1357</p:LocationId>
</p:Reservation>
</p:ReservationRequest>
13579
加利福尼亚州
1357
答复:
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<!--Optional:-->
<tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
<!--Optional:-->
<tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
<!--Optional:-->
<tem:Data><![CDATA[<DATA> <Reservation>
<tktReservationGUID>54321</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation> </DATA>]]></tem:Data>
</tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<tem:ProviderGuid>1111</tem:ProviderGuid>
<tem:Username>usertest</tem:Username>
<tem:Password>passtest</tem:Password>
<tem:Data><![CDATA[<DATA>
<Reservation>
<tktReservationGUID>13579</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>
1111
用户文本
密码文本
54321
加利福尼亚州
1357
]]>
在将另一个主元素“DATA”附加到请求元素之后,我需要将名称空间从请求元素中剥离出来,并在“tem:DATA”下的响应中使用CDATA附加它们
我非常感谢您在使用XSLT将以下请求转换为已发布的响应方面提供的帮助
问候,,
Rudraksh假设XSLT 3.0和Saxon 9.6,您可以使用
序列化
函数将转换后的临时树转换为标记:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://sample.request.com/"
xmlns:tem="http://tempuri.org/"
exclude-result-prefixes="p tem"
version="3.0">
<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/>
<xsl:template match="/">
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<!--Optional:-->
<tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
<!--Optional:-->
<tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
<!--Optional:-->
<tem:Data>
<xsl:variable name="data">
<DATA>
<xsl:apply-templates select="p:ReservationRequest"/>
</DATA>
</xsl:variable>
<xsl:variable name="ser-params">
<output:serialization-parameters
xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
<output:indent value="yes"/>
<output:version value="1.0"/>
<output:method value="xml"/>
<output:omit-xml-declaration value="yes"/>
</output:serialization-parameters>
</xsl:variable>
<xsl:value-of select="serialize($data/*, $ser-params/*)"/>
</tem:Data>
</tem:SendReservation>
</xsl:template>
<xsl:template match="p:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
假设XSLT 3.0和Saxon 9.6,您可以使用
serialize
函数将转换后的临时树转换为标记:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://sample.request.com/"
xmlns:tem="http://tempuri.org/"
exclude-result-prefixes="p tem"
version="3.0">
<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/>
<xsl:template match="/">
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<!--Optional:-->
<tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
<!--Optional:-->
<tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
<!--Optional:-->
<tem:Data>
<xsl:variable name="data">
<DATA>
<xsl:apply-templates select="p:ReservationRequest"/>
</DATA>
</xsl:variable>
<xsl:variable name="ser-params">
<output:serialization-parameters
xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
<output:indent value="yes"/>
<output:version value="1.0"/>
<output:method value="xml"/>
<output:omit-xml-declaration value="yes"/>
</output:serialization-parameters>
</xsl:variable>
<xsl:value-of select="serialize($data/*, $ser-params/*)"/>
</tem:Data>
</tem:SendReservation>
</xsl:template>
<xsl:template match="p:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
假设XSLT 3.0和Saxon 9.6,您可以使用
serialize
函数将转换后的临时树转换为标记:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://sample.request.com/"
xmlns:tem="http://tempuri.org/"
exclude-result-prefixes="p tem"
version="3.0">
<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/>
<xsl:template match="/">
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<!--Optional:-->
<tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
<!--Optional:-->
<tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
<!--Optional:-->
<tem:Data>
<xsl:variable name="data">
<DATA>
<xsl:apply-templates select="p:ReservationRequest"/>
</DATA>
</xsl:variable>
<xsl:variable name="ser-params">
<output:serialization-parameters
xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
<output:indent value="yes"/>
<output:version value="1.0"/>
<output:method value="xml"/>
<output:omit-xml-declaration value="yes"/>
</output:serialization-parameters>
</xsl:variable>
<xsl:value-of select="serialize($data/*, $ser-params/*)"/>
</tem:Data>
</tem:SendReservation>
</xsl:template>
<xsl:template match="p:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
假设XSLT 3.0和Saxon 9.6,您可以使用
serialize
函数将转换后的临时树转换为标记:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://sample.request.com/"
xmlns:tem="http://tempuri.org/"
exclude-result-prefixes="p tem"
version="3.0">
<xsl:output indent="yes" cdata-section-elements="tem:Data" omit-xml-declaration="yes"/>
<xsl:template match="/">
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<!--Optional:-->
<tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
<!--Optional:-->
<tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
<!--Optional:-->
<tem:Data>
<xsl:variable name="data">
<DATA>
<xsl:apply-templates select="p:ReservationRequest"/>
</DATA>
</xsl:variable>
<xsl:variable name="ser-params">
<output:serialization-parameters
xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization">
<output:indent value="yes"/>
<output:version value="1.0"/>
<output:method value="xml"/>
<output:omit-xml-declaration value="yes"/>
</output:serialization-parameters>
</xsl:variable>
<xsl:value-of select="serialize($data/*, $ser-params/*)"/>
</tem:Data>
</tem:SendReservation>
</xsl:template>
<xsl:template match="p:*">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我能够稍微更改输入请求,使其与我的响应非常相似。我在下面发布了我的新请求以及用于转换它的XSLT 新要求:
<p:ReservationRequest xmlns:p="http://sample.request.com/">
<p:DATA>
<!--Exactly 1 occurrence-->
<p:Reservation>
<p:tktReservationGUID>13579</p:tktReservationGUID>
<p:tktState>CA</p:tktState>
<p:LocationId>1357</p:LocationId>
</p:Reservation>
</p:DATA>
</p:ReservationRequest>
13579
加利福尼亚州
1357
新XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tem="http://tempuri.org/" xmlns:p="http://sample.request.com/" exclude-result-prefixes="p tem" version="1.0">
<xsl:output indent="yes" cdata-section-elements="tem:Data"/>
<xsl:template match="/">
<tem:SendReservation>
<!--Optional:-->
<tem:ProviderGuid>1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username>usertest</tem:Username>
<!--Optional:-->
<tem:Password>passtest</tem:Password>
<!--Optional:-->
<tem:Data>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:apply-templates select="/p:ReservationRequest/p:DATA"></xsl:apply-templates>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</tem:Data>
</tem:SendReservation>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."></xsl:value-of>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
1111
用户测试
通过测试
![CDATA[
]]
答复:
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<!--Optional:-->
<tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
<!--Optional:-->
<tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
<!--Optional:-->
<tem:Data><![CDATA[<DATA> <Reservation>
<tktReservationGUID>54321</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation> </DATA>]]></tem:Data>
</tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<tem:ProviderGuid>1111</tem:ProviderGuid>
<tem:Username>usertest</tem:Username>
<tem:Password>passtest</tem:Password>
<tem:Data><![CDATA[<DATA>
<Reservation>
<tktReservationGUID>13579</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>
1111
用户测试
通过测试
13579
加利福尼亚州
1357
]]>
我能够稍微更改输入请求,使其与我的响应非常相似。我在下面发布了我的新请求以及用于转换它的XSLT
新要求:
<p:ReservationRequest xmlns:p="http://sample.request.com/">
<p:DATA>
<!--Exactly 1 occurrence-->
<p:Reservation>
<p:tktReservationGUID>13579</p:tktReservationGUID>
<p:tktState>CA</p:tktState>
<p:LocationId>1357</p:LocationId>
</p:Reservation>
</p:DATA>
</p:ReservationRequest>
13579
加利福尼亚州
1357
新XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tem="http://tempuri.org/" xmlns:p="http://sample.request.com/" exclude-result-prefixes="p tem" version="1.0">
<xsl:output indent="yes" cdata-section-elements="tem:Data"/>
<xsl:template match="/">
<tem:SendReservation>
<!--Optional:-->
<tem:ProviderGuid>1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username>usertest</tem:Username>
<!--Optional:-->
<tem:Password>passtest</tem:Password>
<!--Optional:-->
<tem:Data>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:apply-templates select="/p:ReservationRequest/p:DATA"></xsl:apply-templates>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</tem:Data>
</tem:SendReservation>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."></xsl:value-of>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
1111
用户测试
通过测试
![CDATA[
]]
答复:
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<!--Optional:-->
<tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
<!--Optional:-->
<tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
<!--Optional:-->
<tem:Data><![CDATA[<DATA> <Reservation>
<tktReservationGUID>54321</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation> </DATA>]]></tem:Data>
</tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<tem:ProviderGuid>1111</tem:ProviderGuid>
<tem:Username>usertest</tem:Username>
<tem:Password>passtest</tem:Password>
<tem:Data><![CDATA[<DATA>
<Reservation>
<tktReservationGUID>13579</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>
1111
用户测试
通过测试
13579
加利福尼亚州
1357
]]>
我能够稍微更改输入请求,使其与我的响应非常相似。我在下面发布了我的新请求以及用于转换它的XSLT
新要求:
<p:ReservationRequest xmlns:p="http://sample.request.com/">
<p:DATA>
<!--Exactly 1 occurrence-->
<p:Reservation>
<p:tktReservationGUID>13579</p:tktReservationGUID>
<p:tktState>CA</p:tktState>
<p:LocationId>1357</p:LocationId>
</p:Reservation>
</p:DATA>
</p:ReservationRequest>
13579
加利福尼亚州
1357
新XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tem="http://tempuri.org/" xmlns:p="http://sample.request.com/" exclude-result-prefixes="p tem" version="1.0">
<xsl:output indent="yes" cdata-section-elements="tem:Data"/>
<xsl:template match="/">
<tem:SendReservation>
<!--Optional:-->
<tem:ProviderGuid>1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username>usertest</tem:Username>
<!--Optional:-->
<tem:Password>passtest</tem:Password>
<!--Optional:-->
<tem:Data>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:apply-templates select="/p:ReservationRequest/p:DATA"></xsl:apply-templates>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</tem:Data>
</tem:SendReservation>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."></xsl:value-of>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
1111
用户测试
通过测试
![CDATA[
]]
答复:
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<!--Optional:-->
<tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
<!--Optional:-->
<tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
<!--Optional:-->
<tem:Data><![CDATA[<DATA> <Reservation>
<tktReservationGUID>54321</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation> </DATA>]]></tem:Data>
</tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<tem:ProviderGuid>1111</tem:ProviderGuid>
<tem:Username>usertest</tem:Username>
<tem:Password>passtest</tem:Password>
<tem:Data><![CDATA[<DATA>
<Reservation>
<tktReservationGUID>13579</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>
1111
用户测试
通过测试
13579
加利福尼亚州
1357
]]>
我能够稍微更改输入请求,使其与我的响应非常相似。我在下面发布了我的新请求以及用于转换它的XSLT
新要求:
<p:ReservationRequest xmlns:p="http://sample.request.com/">
<p:DATA>
<!--Exactly 1 occurrence-->
<p:Reservation>
<p:tktReservationGUID>13579</p:tktReservationGUID>
<p:tktState>CA</p:tktState>
<p:LocationId>1357</p:LocationId>
</p:Reservation>
</p:DATA>
</p:ReservationRequest>
13579
加利福尼亚州
1357
新XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tem="http://tempuri.org/" xmlns:p="http://sample.request.com/" exclude-result-prefixes="p tem" version="1.0">
<xsl:output indent="yes" cdata-section-elements="tem:Data"/>
<xsl:template match="/">
<tem:SendReservation>
<!--Optional:-->
<tem:ProviderGuid>1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username>usertest</tem:Username>
<!--Optional:-->
<tem:Password>passtest</tem:Password>
<!--Optional:-->
<tem:Data>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:apply-templates select="/p:ReservationRequest/p:DATA"></xsl:apply-templates>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</tem:Data>
</tem:SendReservation>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."></xsl:value-of>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
1111
用户测试
通过测试
![CDATA[
]]
答复:
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<!--Optional:-->
<tem:ProviderGuid xmlns:tem="http://tempuri.org/">1111</tem:ProviderGuid>
<!--Optional:-->
<tem:Username xmlns:tem="http://tempuri.org/">usertext</tem:Username>
<!--Optional:-->
<tem:Password xmlns:tem="http://tempuri.org/">passtext</tem:Password>
<!--Optional:-->
<tem:Data><![CDATA[<DATA> <Reservation>
<tktReservationGUID>54321</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation> </DATA>]]></tem:Data>
</tem:SendReservation>
<tem:SendReservation xmlns:tem="http://tempuri.org/">
<tem:ProviderGuid>1111</tem:ProviderGuid>
<tem:Username>usertest</tem:Username>
<tem:Password>passtest</tem:Password>
<tem:Data><![CDATA[<DATA>
<Reservation>
<tktReservationGUID>13579</tktReservationGUID>
<tktState>CA</tktState>
<LocationId>1357</LocationId>
</Reservation>
</DATA>]]></tem:Data>
</tem:SendReservation>
1111
用户测试
通过测试
13579
加利福尼亚州
1357
]]>
能否将XSLT 3.0与Saxon 9.6结合使用?或者您针对哪个XSLT处理器使用哪个XSLT版本?能否将XSLT 3.0与Saxon 9.6结合使用?或者您针对哪个XSLT处理器使用哪个XSLT版本?能否将XSLT 3.0与Saxon 9.6结合使用?或者您针对哪个XSLT处理器使用哪个XSLT版本?能否将XSLT 3.0与Saxon 9.6结合使用?或者您针对哪个XSLT版本和哪个XSLT处理器?Martin,谢谢您的解决方案。但是,我们的XSLT引擎不支持此选项。我们仍然使用XSL1.0作为引擎的一部分。是否有任何解决方案可以使用xsl 1.0完成?请检查XSLT 1.0处理器是否提供或允许您实现扩展函数来序列化树,或集成纯XSLT 1.0解决方案,如代码中所示。@Rudraksh,我已经添加了一个XSLT1.0示例,它使用了我在前面的评论中链接到的库模块xml-to-string
。我也尝试了这个选项。但是,我的编辑器没有使用该模块。我仍在努力使这一点起作用。我真的很感激你能更快地恢复过来。如果你的编辑器没有通过HTTP加载样式表模块,你可以下载样式表模块并在本地使用。Martin,谢谢你的解决方案。但是,我们的XSLT引擎不支持此选项。我们仍然使用XSL1.0作为引擎的一部分。是否有任何解决方案可以使用xsl 1.0完成?请检查XSLT 1.0处理器是否提供或允许您实现exte