【问题标题】:xsl:namespace-alias does not work as expected while using xsl:copy-of使用 xsl:copy-of 时 xsl:namespace-alias 无法按预期工作
【发布时间】: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 代码中的某个命名空间中创建结果元素,以便稍后映射到结果命名空间,它无助于更改输入节点的命名空间。
  • 我应该如何更改输入节点的命名空间?
  • 写模板如&lt;xsl:template match="old:*"&gt;&lt;xsl:element name="gcp:{local-name()}" namespace="http://random.com/G/Modify"&gt;&lt;xsl:apply-templates select="@* | node()"/&gt;&lt;xsl:template&gt;

标签: xml xslt xslt-1.0 xslt-2.0 saxon


【解决方案1】:

你在这里问了同样的问题:https://saxonica.plan.io/issues/4817

这是我的回答:

如果您阅读 xsl:namespace-alias 的规范,您会发现它只影响文字结果元素。 如果要复制命名空间更改的元素,请使用模板规则,例如

<xsl:template match=xyz:"*">
  <xsl:element name="{local-name()}" namespace="http://new-namespace/">
     <xsl:apply-templates select="@*, node()"/>
  </xsl:element>
</xsl:template>

请不要通过在多个不同的论坛上提出相同的问题来为人们付出额外的努力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2014-12-09
    • 2016-01-13
    相关资源
    最近更新 更多