【发布时间】:2020-11-05 09:36:37
【问题描述】:
我有一个要求,我必须从请求有效负载中删除肥皂信封,并将父标记的命名空间从命名空间 "random.com/system/i/Modify/1.0" 更改为 "http://random.com/G/Modify",将请求标头从命名空间 "http://random.com/2/MsgHeader/" 更改为 "http://random.com/3/MsgHeader/" 和请求正文命名空间"http://random.com/2/MsgBody/" 到 "http://random.com/3/MsgBody/"
我不确定为什么 xsl:namespace-alias 无法正确更改命名空间
转换文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
version="3.0"
exclude-result-prefixes="soapenv"
xmlns:old="random.com/system/i/Modify/1.0/"
xmlns:gcp="http://random.com/G/Modify"
xmlns:ogcph="http://random.com/2/MsgHeader/"
xmlns:hgcph="http://random.com/3/MsgHeader/"
xmlns:ogcpb="http://random.com/2/MsgBody/"
xmlns:hgcpb="http://random.com/3/MsgBody/">
<xsl:namespace-alias stylesheet-prefix="soapenv" result-prefix="#default"/>
<xsl:namespace-alias stylesheet-prefix="old" result-prefix="gcp"/>
<xsl:namespace-alias stylesheet-prefix="ogcph" result-prefix="hgcph"/>
<xsl:namespace-alias stylesheet-prefix="ogcpb" result-prefix="hgcpb"/>
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<gcp:Modifys>
<gcp:Modify>
<xsl:copy-of copy-namespaces="no" select="/*:Envelope/*:Body/*:Modifys/*:Modify/*"/>
</gcp:Modify>
</gcp:Modifys>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
您“期望”命名空间别名如何工作?它允许您在 XSLT 代码中的某个命名空间中创建结果元素,以便稍后映射到结果命名空间,它无助于更改输入节点的命名空间。
-
我应该如何更改输入节点的命名空间?
-
写模板如
<xsl:template match="old:*"><xsl:element name="gcp:{local-name()}" namespace="http://random.com/G/Modify"><xsl:apply-templates select="@* | node()"/><xsl:template>
标签: xml xslt xslt-1.0 xslt-2.0 saxon