gpt4 book ai didi

xml - 使用 XSLT 转义内部子节点时,根 xml 命名空间被错误映射

转载 作者:行者123 更新时间:2023-12-04 16:55:25 24 4
gpt4 key购买 nike

我有一个如下的 XML,

<root xmlns="http://www.oracle.com/retail/integration/rib/RibMessages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mspdv170.us.oracle.com:7779/rib-func-artifact/integration/xsd/RibMessages.xsd">
<parent>test</parent>
<parentdtl>
<child xmlns="http://test.com">
<element1>1</element1>
</child>
</parentdtl>
<outer>T</outer>
</root>
并希望将 XML 转换为
<root xmlns="http://www.oracle.com/retail/integration/rib/RibMessages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mspdv170.us.oracle.com:7779/rib-func-artifact/integration/xsd/RibMessages.xsd">
<parent>test</parent>
<parentdtl>
&lt;child xmlns="http://test.com"&gt;
&lt;element1&gt;1&lt;/element1&gt;
&lt;/child&gt;
</parentdtl>
<outer>T</outer>
</root>
使用来自 StackOverflow 中另一篇文章的引用尝试使用以下 XSL 脚本,但它没有正确映射
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:template match="*">
<xsl:value-of select="serialize(.)"/>
</xsl:template>
<xsl:template match="*:root|*:parent|*:parentdtl|*:outer">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
为此使用 Mule ESB 工具,它使用 Saxon 9.6 版本
收到的输出是
<?xml version="1.0" encoding="UTF-8"?><root xmlns="http://www.oracle.com/retail/integration/rib/RibMessages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">http://mspdv170.us.oracle.com:7779/rib-func-artifact/integration/xsd/RibMessages.xsd
<parent>test</parent>
<parentdtl>
&lt;child xmlns="http://test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
&lt;element1&gt;1&lt;/element1&gt;
&lt;/child&gt;
</parentdtl>
<outer>T</outer>
</root>
输出在子转义节点中包含错误的命名空间,并且在根中它已损坏。如果有人解决了类似的要求,请分享您的想法。

最佳答案

我不确定你所说的“在根中它正在被破坏”是什么意思。请注意,您发布的 XML 有拼写错误,例如根开始标记中缺少引号。
序列化的子元素包含 xsi 的命名空间声明的原因命名空间是 XDM 数据模型将所有继承的命名空间视为它们是在元素本身上本地声明的。如果您希望序列化表单仅包含元素或其属性上实际使用的命名空间绑定(bind),请尝试使用 <xsl:copy-of copy-namespaces="no"/> 进行复制。在序列化之前,消除不需要的命名空间。
更新
在你的 fiddle 中你正在做

<xsl:copy-of select ="@*" copy-namespaces="no"/>
<xsl:value-of select="serialize(., $ser-params)" />
所以 serialize() 没有应用于副本,而是应用于原始。你需要类似的东西
<xsl:variable name="copy-sans-namespaces" as="xs:element">
<xsl:copy-of select="." copy-namespaces="no"/>
</xsl:variable>
<xsl:value-of select="serialize($copy-sans-namespaces, $ser-params)" />

关于xml - 使用 XSLT 转义内部子节点时,根 xml 命名空间被错误映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64243974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com