对于混合命名空间 XML 内容,如何防止在新创建的元素上出现冗余 xmlns: 定义? | 命名空间
本文介绍了对于混合命名空间
问题描述 我有以下包含 MathML 命名空间元素的 HTML 文档:
<头><title>方程</title>头部><身体><p><!-- MathML 元素--><math </html>
我有以下 XSLT 匹配/修改/创建顶级(默认)和 MathML 命名空间中的内容:
<xsl:stylesheet <!-- 基线身份变换--><xsl:template match="@*|node()"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:模板><!-- 在顶级(默认)命名空间中匹配和创建元素 --><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