使用xsl输出数学表达式
我想使用 xslt 从 Mathml 输入输出数学表达式。我的变换一定有什么错误。我不知道如何纠正它。你能帮我吗?我应该使用参数还是变量来控制它? xml:
<?xml version="1.0" encoding="UTF-8"?>
<math>
<apply>
<eq/>
<apply>
<plus/>
<apply>
<power/>
<ci>x</ci>
<cn>2</cn>
</apply>
<apply>
<times/>
<cn>2</cn>
<ci>x</ci>
</apply>
<cn>2</cn>
</apply>
<cn>0</cn>
</apply>
</math>
这是我的 xsl:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="math">
<xsl:apply-templates select="apply"/>
</xsl:template>
<xsl:template match="apply">
<xsl:sequence select="name(element()[1]),'('"/>
<xsl:apply-templates select="apply">
</xsl:apply-templates>
<xsl:sequence select="element()[2],','"/>
<xsl:sequence select="element()[3],')',','"/>
</xsl:template>
</xsl:stylesheet>
结果应该是:
eq(plus(power(x,2),times(2,x),2),0)
I want to use xslt to output the math expression from Mathml input. There must be some mistake in my transform. I don't know how to correct it. Could you help me? Should I use parameter or variable to control it?
xml:
<?xml version="1.0" encoding="UTF-8"?>
<math>
<apply>
<eq/>
<apply>
<plus/>
<apply>
<power/>
<ci>x</ci>
<cn>2</cn>
</apply>
<apply>
<times/>
<cn>2</cn>
<ci>x</ci>
</apply>
<cn>2</cn>
</apply>
<cn>0</cn>
</apply>
</math>
This is my xsl:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="math">
<xsl:apply-templates select="apply"/>
</xsl:template>
<xsl:template match="apply">
<xsl:sequence select="name(element()[1]),'('"/>
<xsl:apply-templates select="apply">
</xsl:apply-templates>
<xsl:sequence select="element()[2],','"/>
<xsl:sequence select="element()[3],')',','"/>
</xsl:template>
</xsl:stylesheet>
The result should be:
eq(plus(power(x,2),times(2,x),2),0)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个完整而简短的转换:
应用于提供的 XML 文档时:
产生所需的正确结果:
This complete and short transformation:
when applied on the provided XML document:
produce the wanted, correct result:
我稍微改变了你原来的转换以获得想要的结果。基本上,
apply
模板规则是决定函数括号的规则。为了确定是否插入逗号,我正在检查以下特定类型的同级元素。此外,我已将您的
xsl:sequence
替换为xsl:value-of
,从而防止创建不需要的空间(我想象它们是不需要的)。函数element()
也已被替换。该样式表现在与 XSLT 1.0 兼容。我不喜欢 XSLT 1.0,但我更喜欢仅在真正必要时才使用新功能。这个解决方案不是很通用(你知道 MATHML 是一个巨大的规范),但是你可以使用它并使其适应更复杂的情况。
XSLT 1.0 在 Saxon 6.5.5 下测试
当应用于问题中显示的输入时会产生:
I've slightly changed your original transform to obtain the wanted result. Basically, the
apply
template rule it's the one deciding for the function parentesis. To determine whether or not insert a comma I'm checking for following sibling elements of specific types.Moreover, I've replaced your
xsl:sequence
withxsl:value-of
thus preventing the creation of unwanted spaces (I immagine they are unwanted). Also the functionelement()
has been replaced. The stylesheet is now XSLT 1.0 compatible. I'm not a fun of XSLT 1.0, but I prefer to use new functions only when really necessary.This solution is not very general (MATHML is a huge spec you know), but you can use it and adapt it to more complex cases.
XSLT 1.0 tested under Saxon 6.5.5
When applied to the input shown in the question produces: