我在xslt转换中遇到了一些问题。我想删除在xslt转换过程中添加到结果中的多余名称空间。
这是我的源xml:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Root xmlns="http://www.abc123.org/xyz/ase" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Header>
<CreationDateTime>2019-05-08T06:34:04.2235068-05:0011</CreationDateTime>
<BODID>51c336d1-8e6a-46211c-973f-a9ca6c8a33ce</BODID>
<ReferenceID>9078111e00-9b82-46b3-a419-be80521b2a94</ReferenceID>
<Success>false</Success>
</Header>
<Data>
<ErrorMessage>
<ID/>
<Type>Invalid Data</Type>
<Description>InvalidData</Description>
</ErrorMessage>
</Data>
</Root>
</soapenv:Body>
</soapenv:Envelope>
这是我的xslt代码:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" exclude-result-prefixes="soapenv">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="soapenv:*">
<xsl:apply-templates select="@* | node()" />
</xsl:template>
</xsl:stylesheet>
预期输出:
<Root xmlns="http://www.abc123.org/xyz/ase"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Header>
<CreationDateTime>2019-05-08T06:34:04.2235068-05:0011</CreationDateTime>
<BODID>51c336d1-8e6a-46211c-973f-a9ca6c8a33ce</BODID>
<ReferenceID>9078111e00-9b82-46b3-a419-be80521b2a94</ReferenceID>
<Success>false</Success>
</Header>
<Data>
<ErrorMessage>
<ID/>
<Type>Invalid Data</Type>
<Description>InvalidData</Description>
</ErrorMessage>
</Data>
</Root>
实际输出:
<Root xmlns="http://www.abc123.org/xyz/ase"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<Header>
<CreationDateTime>2019-05-08T06:34:04.2235068-05:0011</CreationDateTime>
<BODID>51c336d1-8e6a-46211c-973f-a9ca6c8a33ce</BODID>
<ReferenceID>9078111e00-9b82-46b3-a419-be80521b2a94</ReferenceID>
<Success>false</Success>
</Header>
<Data>
<ErrorMessage>
<ID/>
<Type>Invalid Data</Type>
<Description>InvalidData</Description>
</ErrorMessage>
</Data>
</Root>
在这里,我得到了需要删除的额外名称空间“ xmlns:soapenv”。
建议改正。
谢谢
答案 0 :(得分:1)
xsl:copy
将复制XML中声明的所有名称空间,即使元素本身不使用该名称空间。
您可以做的,不是在元素上使用xsl:copy
,而是使用xsl:element
创建新元素,然后仅复制所需的名称空间声明。...
尝试将此模板添加到您的XSLT
<xsl:template match="*[namespace-uri() != 'http://schemas.xmlsoap.org/soap/envelope/']" priority="2">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:copy-of select="namespace::*[. != 'http://schemas.xmlsoap.org/soap/envelope/']" />
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>