拥有这个XML,我需要删除所有前缀,我之前已经这样做了,但是有一个特定的NS2前缀我无法删除。
检查:
输入XML
<NS1:Envelope xmlns:NS1="http://schemas.xmlsoap.org/soap/envelope/">
<NS1:Header>
<NS2:responseHeader xmlns:NS2="http://test.com">
<systemId>SI</systemId>
<messageId>000001</messageId>
<timestamp>2015-01-16T10:10:09.872983</timestamp>
<responseStatus>
<statusCode>Success</statusCode>
</responseStatus>
</NS2:responseHeader>
</NS1:Header>
<NS1:Body>
<NS2:modificarSolicitudDeCreditoResponse xmlns:NS2="http://test2.com/21"/>
</NS1:Body>
</NS1:Envelope>
我的XSLT:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="NS2:modificarSolicitudDeCreditoResponse">
<modificarSolicitudDeCreditoResponse>
<xsl:apply-templates select="@*|node()"/>
</modificarSolicitudDeCreditoResponse>
</xsl:template>
<xsl:template match="NS1:Header">
<Header>
<xsl:apply-templates select="@*|node()"/>
</Header>
</xsl:template>
<xsl:template match="NS2:responseHeader">
<responseHeader>
<xsl:apply-templates select="@*|node()"/>
</responseHeader>
</xsl:template>
<xsl:template match="NS1:Body">
<Body>
<xsl:apply-templates select="@*|node()"/>
</Body>
</xsl:template>
<xsl:template match="/*">
<Envelope>
<xsl:apply-templates select="node()" />
</Envelope>
</xsl:template>
</xsl:stylesheet>
这是我的输出:
<?xml version='1.0' ?>
<Envelope xmlns:NS1="http://schemas.xmlsoap.org/soap/envelope/"
<Header>
<responseHeader>
<systemId>AW0856</systemId>
<messageId>0000012</messageId>
<timestamp>2015-01-16T10:10:09.872983</timestamp>
<responseStatus>
<statusCode>Success</statusCode>
</responseStatus>
</responseHeader>
</Header>
<Body>
<NS2:modificarSolicitudDeCreditoResponse xmlns:NS2="http://test2.com/21">
</Body>
</Envelope>
我在身体标签后移除NS2时遇到问题,有谁知道我怎么能做到这一点, 感谢
答案 0 :(得分:0)
以下是删除输入XML的所有前缀的方法:复制元素,同时将name()
替换为local-name()
(没有命名空间的名称)。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" />
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node() | @*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出
<?xml version="1.0"?>
<Envelope>
<Header>
<responseHeader>
<systemId>SI</systemId>
<messageId>000001</messageId>
<timestamp>2015-01-16T10:10:09.872983</timestamp>
<responseStatus>
<statusCode>Success</statusCode>
</responseStatus>
</responseHeader>
</Header>
<Body>
<modificarSolicitudDeCreditoResponse/>
</Body>
</Envelope>
但这也删除了所有命名空间定义。目前我不知道你喜欢如何处理这些。