gpt4 book ai didi

xslt - 如何控制 XSLT 输出中的命名空间前缀(特别是默认命名空间)?

转载 作者:行者123 更新时间:2023-12-04 17:01:10 25 4
gpt4 key购买 nike

在 XSLT 中,有没有办法控制输出元素中 namespace 前缀的选择?
在我的特殊情况下,我实际上想要转换看起来像的输入

<h:html xmlns:h='http://www.w3.org/1999/xhtml'
xmlns:m='http://www.w3.org/1998/Math/MathML'>
....
<h:p>Equation: <m:math>...</m:math></h:p>
进入
<html xmlns='http://www.w3.org/1999/xhtml'>
....
<p>Equation: <math xmlns='http://www.w3.org/1998/Math/MathML'>...</math></p>
也就是说,身份转换只是更改 namespace 前缀,以根据需要为 XHTML 和 MathML 元素使用默认 namespace 。
这是纯 XML 工作流结束时的整理步骤。以上当然在 XML 术语中是等效的,因此在 XHTML 术语中,但浏览器似乎并不总是知道这一点(在我不太系统的测试中,Firefox 管理上述两个,在将它们呈现为数学的意义上 - Firefox 做得好!——Safari 管理第二个但不是第一个,Chrome 也没有管理;我实际上是针对 EPUB 读者的,但对那里的 XHTML 解析器持悲观态度似乎是明智的)。尝试使用 <output method='html'/> XSLT 元素不会对输出产生影响。 XHTML Compatibility Guidelines不要提到命名空间,而是令人惊讶。添加文档类型声明,甚至 <meta http-equiv=''...> hack 提示 application/xhtml+xml,似乎对浏览器的行为没有任何影响。
我在 XSLT 1.0 规范中没有看到控制这一点的任何内容。那里提到的命名空间别名正在解决一个不同的问题;使用 XSLT 中的默认 namespace 不会提供任何提示 libxslt似乎倾向于采取。其他堆栈交换问题(例如 this onethis one )似乎主要是对 XSLT 和 namespace 的误解。我敢肯定,在我长期使用 XSLT 的某个时候,我已经设法实现了这一点,但是如果我做到了,我就无法恢复它。
我非常喜欢 XSLT 1.0 中的解决方案,因为我拥有可以快速使用的工具和经验,在 libxslt 中和 xsltproc (Saxon 是一件非常美妙的事情,但我不愿意为可能的大量连续转换支付 Java 启动成本)。这可能是迫使我使用更高版本的 XSLT 的原因,当然,如果更高版本确实是唯一可以提供帮助的东西。
从(不是很彻底)查看 XSLT 3 规范(例如 section 11.1 ),我看不到任何明显解决此问题的内容。
如果我发现错误的树,或者如果 EPUB 处理器一直对命名空间更加了解,以至于我实际上是在解决问题的错误部分,我也愿意接受这些信息。

最佳答案

你需要转型

<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="namespace-uri()">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
为其余部分设置身份转换模板。
在 XSLT 1 中,您有点依赖 XSLT 处理器及其序列化程序的摆布来获得您想要的输出,但我认为对于上述模板,即使在 1.0 世界中,您也可以期待一些一致性。

关于xslt - 如何控制 XSLT 输出中的命名空间前缀(特别是默认命名空间)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65238875/

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