Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何控制XSLT输出中的名称空间前缀(特别是默认名称空间)?_Xslt_Namespaces - Fatal编程技术网

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

如何控制XSLT输出中的名称空间前缀(特别是默认名称空间)?,xslt,namespaces,Xslt,Namespaces,在XSLT中,有没有办法控制输出元素中名称空间前缀的选择 在我的特殊情况下,我实际上想要转换如下所示的输入 <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> .... 方程式:。。。 进入

在XSLT中,有没有办法控制输出元素中名称空间前缀的选择

在我的特殊情况下,我实际上想要转换如下所示的输入

<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>

....
方程式:。。。
进入


....
方程式:

也就是说,标识转换只需更改名称空间前缀,就可以根据需要为XHTML和MathML元素使用默认名称空间

这是纯XML工作流末尾的一个整理步骤。当然,上述内容在XML术语中是等价的,因此在XHTML术语中也是等价的,但浏览器似乎并不总是知道这一点(在我不太系统的测试中,Firefox管理上述两项,从数学的角度来看——做得好Firefox!——Safari管理第二项,但不是第一项,Chrome也不管理;我实际上是针对EPUB阅读器,但对XHTML解析器持悲观态度似乎是明智的)。尝试使用
XSLT元素不会对输出产生任何影响。令人惊讶的是,没有提到名称空间。添加doctype声明,甚至
hack to hint application/xhtml+xml,似乎对浏览器的行为没有任何影响

我在XSLT 1.0规范中看不到任何东西可以控制这一点。这里提到的名称空间别名解决了一个不同的问题;在XSLT中使用默认名称空间不会提供任何
libxslt
似乎倾向于接受的提示。其他stackexchange问题(例如或)似乎在很大程度上误解了XSLT和名称空间。我相信在我漫长的XSLT历史中,我已经成功地实现了这一点,但如果我做到了,我就无法恢复它

我非常喜欢XSLT 1.0中的解决方案,因为我有在和
xsltproc
中快速使用的工具和经验(Saxon是一件非常棒的事情,但我不愿意为可能的大量后续转换支付Java启动成本)当然,这可能是迫使我使用更高版本XSLT的原因,如果更高版本确实是唯一有帮助的

从XSLT3规范(例如)来看(不是很彻底),我看不到任何明显能解决这个问题的东西


如果我选错了树,或者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世界中,您也可以期望具有一定的一致性。

这看起来非常有希望,并且在我尝试过的简单情况下确实有效。真正的代码当然比我的问题,但我会试一试,然后回到这个答案。这在实践中确实非常有效,因为这似乎给了序列化程序足够的提示。序列化程序没有完全接受提示(如您所建议的):不幸的是,在此构造中处理的任何包含eg
的模板都是使用该前缀序列化的,而不是默认前缀,该前缀此时仍在范围内。这意味着我不能将XSLT元素保留在默认名称空间中,但…我会活下去的。感谢Martin,让我确信我没有遗漏任何内容。
<xsl:template match="*">
  <xsl:element name="{local-name()}" namespace="namespace-uri()">
     <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>