我想使用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)
答案 0 :(得分:2)
我稍微改变了原始变换以获得想要的结果。基本上,apply
模板规则是决定功能性胃肠炎的决定因素。要确定是否插入逗号,我正在检查以下特定类型的兄弟元素。
此外,我已将xsl:sequence
替换为xsl:value-of
,从而防止产生不需要的空格(我想象它们是不需要的)。函数element()
也已被替换。样式表现在与XSLT 1.0兼容。我不是XSLT 1.0的乐趣,但我更喜欢在真正需要的时候使用新功能。
这个解决方案不是很通用(你知道MATHML是一个很大的规范),但你可以使用它并使其适应更复杂的情况。
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="apply">
<xsl:value-of select="concat(name(child::*[1]),'(')"/>
<xsl:apply-templates select="apply|cn|ci"/>
<xsl:value-of select="')'"/>
<xsl:if test="count(following-sibling::*)">
<xsl:value-of select="','"/>
</xsl:if>
</xsl:template>
<xsl:template match="cn|ci">
<xsl:value-of select="."/>
<xsl:if test="count(following-sibling::*)>0">
<xsl:value-of select="','"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当应用于问题中显示的输入时产生:
eq(plus(power(x,2),times(2,x),2),0)
答案 1 :(得分:2)
这种完整而短暂的转型:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="apply">
<xsl:if test="not(position()=1)">,</xsl:if>
<xsl:apply-templates select="*[1]"/>
</xsl:template>
<xsl:template match="eq|plus|power|times">
<xsl:if test="not(position()=1)">,</xsl:if>
<xsl:value-of select="concat(name(), '(')"/>
<xsl:apply-templates select="following-sibling::*"/>
<xsl:text>)</xsl:text>
</xsl:template>
<xsl:template match="cn|ci">
<xsl:if test="not(position()=1)">,</xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<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>
生成想要的正确结果:
eq(plus(power(x,2),times(2,x),2),0)