我想按顺序在'fomula'元素下面获取文本节点和元素节点,将XML转换为HTML。 我显示下面的XML代码。文本不固定。 (我再次写了代码)如何使用xsl获取文本节点?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<section>
<formula>
m=12n
<superscript>
2
</superscript>
+3(3n
<superscript>
2
</superscript>
+2)
</formula>
<xxx>
abc
</xxx>
<formula>
c=a+b
<superscript>
4
</superscript>
</formula>
</section>
</root>
我应该怎么写XSL才能得到下面的结果?
<p>m=12n<span>2</span>+3(3n<span>2</span>+2</p>
<p>abc</p>
<p>c=a+b<span>4</span></p>
当我得到特定的元素节点时,我通常会写下如下所示的XSL。但我不知道如何依次使用同胞元素节点来获取文本节点。 请给我建议。 (我更详细地再次写的代码。)
<xsl:template match="/">
<html>
--omitted--
<body>
<xsl:apply-templates select="/root/section" />
</body>
<html>
</xsl:template>
<xsl:template match="section">
<xsl:for-each select="*">
<xsl:if test="name()='formula'">
<xsl:apply-templates select="." />
</xsl:if>
<xsl:if test="name()='xxx'">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="formula">
<p>
<xsl:apply-templates select="." />
</p>
</xsl:template>
<xsl:template match="xxx">
<p>
<xsl:apply-templates select="." />
</p>
</xsl:template>
如果您编写'test =”name()='aaa'“',这与'test = aaa'相同,不需要获取名称的字符串值。但更好的是,如答案所示,不要使用这些带有节点的'xsl:if'构造,它们会混乱你的代码,而且是不必要的。只需使用'xsl:apply-templates'(另请参阅Rubens的回答),只有在找到匹配的节点时才起作用。 – Abel
谢谢您的建议。我很高兴知道使用“测试”的简单方法。但我仍然困惑。我很高兴,如果你检查我重写的代码。 – tara
你的'xsl:for-each'将会遍历所有的孩子,你的'xsl:if'只适用于孩子'fomula'和'xxx'(并且仍然用'name()='nodename''来测试,只是'nodename')。你可以用一个' '替换整个'xsl:for-each'及其内容,这与你现在的效果完全相同。 –
Abel