本文介绍了对于混合命名空间

问题描述

我有以下包含 MathML 命名空间元素的 HTML 文档:

<头><title>方程</title><身体><p><!-- MathML 元素--><math </html>

我有以下 XSLT 匹配/修改/创建顶级(默认)和 MathML 命名空间中的内容:

<xsl:template match="body"><xsl:copy><xsl:attribute name="MATCHED";选择=1"/><div CREATED=1"><xsl:apply-templates select="p"/>

</xsl:copy></xsl:模板><!-- 在嵌套命名空间中匹配和创建元素 --><xsl:template match=m:mrow"><xsl:copy><xsl:attribute name="MATCHED";选择=1"/><m:mfenced CREATED=1"><xsl:apply-templates select="m:mi"/></m:mfenced></xsl:copy></xsl:模板></xsl:stylesheet>

我指定应该通过 exclude-result-prefixes 抑制 m: 命名空间前缀,但它们仍然出现在输出中新创建的 MathML 元素上(注意模板创建的 mfenced 元素上的命名空间):

<头><title>方程</title><body MATCHED=1"><div CREATED=1"><p><!-- MathML 元素--><math <mi>m</mi></m:mfenced></mrow></数学></p>

</html>

我如何抑制这些?

解决方案

我使用的解决方案是在每个处理嵌套命名空间内容的 元素上定义一个本地命名空间.模板中的所有匹配/测试表达式仍然需要显式命名空间引用.

在上面的样式表中,两个变化是

 

 ^--- 显式命名空间已删除...</mfenced>^--- 显式命名空间已删除

通过这些更改,我们得到的输出和输入一样干净:

<头><title>方程</title><body MATCHED=1"><div CREATED=1"><p><!-- MathML 元素--><math 

</html>

感谢 Martin、Wendell、Liam 和 David(在 Mulberry XSLT 邮件列表中)以及 Radu(在 Syncro Soft)帮助我理解命名空间!

I have the following HTML document that contains a MathML-namespaced element:

<html>
  <head>
    <title>Equations</title>
  </head>
  <body>
    <p>

      <!-- MathML element -->
      <math 

I have the following XSLT that matches/modifies/creates content in both the top-level (default) and MathML namespaces:

<?

I specify that the m: namespace prefix should be suppressed via exclude-result-prefixes, but they still appear on newly-created MathML elements in the output (note the namespace on the template-created mfenced element):

<html>
   <head>
      <title>Equations</title>
   </head>
   <body MATCHED="1">
      <div CREATED="1">
         <p>

            <!-- MathML element -->
            <math 

How do I suppress these?

解决方案

The solution I used was to define a local namespace on each <xsl:template> element that processes the nested-namespace content. Explicit namespace references are still needed for all match/test expressions within the template.

In the stylesheet above, the two changes are

  <xsl:template match="m:mrow" 

and

  <mfenced CREATED="1">
   ^--- explicit namespace removed
    ...
  </mfenced>
   ^--- explicit namespace removed

With these changes, we get output as clean as the input:

<html>
   <head>
      <title>Equations</title>
   </head>
   <body MATCHED="1">
      <div CREATED="1">
         <p>

            <!-- MathML element -->
            <math 

Thanks to Martin, Wendell, Liam, and David (on the Mulberry XSLT mailing list) and to Radu (at Syncro Soft) for helping me understand namespaces!

这篇关于对于混合命名空间

10-24 12:14