复制 XML 时删除命名空间并添加新元素
我有一个简单的 xml,看起来
<ns0:AAA xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ITSVersion="XML_1.0">
<ns0:id extension="USER_TYPE"/>
<ns0:bb>SOME VALUE</ns0:bb>
<ns0:cc>OTHER VALUE</ns0:cc>
</ns0:AAA>
我正在尝试在顶级元素 AAA
周围添加一个“包装器”元素,并从上面的 XML。最后在
之后添加新元素。
我已尝试为此构建一个 xslt,但不知何故,我无法在复制时删除 ns0
前缀,并且我添加的新元素是通过 xmlns=""
添加的。不确定我做错了什么。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:urn="http://www.example.com">
<xsl:output method="xml" omit-xml-declaration="yes" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:if test="urn:id[@extension='USER_TYPE']">
<xsl:element name="WRAPPER" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()" />
<xsl:element name="cred">
<xsl:attribute name="user">test123</xsl:attribute>
<xsl:element name="password">
<xsl:attribute name="root">n</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:if>
<xsl:if test="urn:Id[@extension='ASSET_TYPE']">
<xsl:element name="WRAPPER" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
xslt 的输出看起来像
<WRAPPER xmlns="http://www.example.com" ITSVersion="XML_1.0">
<ns0:id xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" extension="USER_TYPE"/>
<ns0:bb xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SOME VALUE</ns0:bb>
<ns0:cc xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">OTHER VALUE</ns0:cc>
<cred xmlns="" user="test123"><password root="n"/></cred>
</WRAPPER>
您可以看到 WRAPPER
元素已正确添加,但所有其他元素都有前缀以及 xmlns 属性,我想删除前缀 ns0<这些元素的 /code> 和
xmlns
属性。我添加的新元素 cred
显示为空的 xmlns
。
知道我在这里做错了什么吗?
预先感谢您提供任何帮助?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您所说的“删除名称空间”实际上需要重命名。这意味着您不能使用身份变换模板,该模板保留了所处理的节点 。
相反,请尝试使用以下路线:
XSLT 1.0
应用于您的示例输入,这将产生:
结果
请注意使用文字结果元素。
What you call "remove namespace" actually requires renaming. That means you cannot use the identity transform template which preserves the processed nodes as is.
Try instead something along the lines of:
XSLT 1.0
Applied to your example input, this will produce:
Result
Note the use of literal result elements.