我正在尝试为XML文件构建一个XSLT文件,如下所示,它使用无效的标记嵌套:
<Page>
<Content>
<par>This content <i>contains</i> some HTML <b><i>tags</i></b>.</par>
<par>This content <b>also</b> contains some HTML <i><b>tags</b></i>.</par>
</Content>
</Page>
现在,如果我想将内容输出到新文档,我会这样:
<xsl:template match="Page/Content">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:for-each select="par">
<xsl:apply-templates select="."/>
</xsl:for-each>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:template>
<xsl:template match="par">
<p><xsl:value-of select="." /></p>
</xsl:template>
<xsl:template match="b">
<strong><xsl:value-of select="." /></strong>
</xsl:template>
<xsl:template match="i">
<em><xsl:value-of select="." /></em>
</xsl:template>
我的问题是我需要如何修改template match="par"
以便正确显示<b>
和<i>
代码?
我尝试过像
这样的事情<xsl:template match="par">
<p>
<xsl:apply-templates select="i"/>
<xsl:apply-templates select="b"/>
<xsl:value-of select="." /></p>
</xsl:template>
但这总是会导致输出的顺序不正确,因为<i>
和<b>
标记会显示在整个段落之前。
是否有可能在不改变原始XML格式的情况下执行此操作?
答案 0 :(得分:1)
我没有在您的示例输入中看到任何错误的嵌套标记,因此我不确定您的意思。 XSLT无法处理错误的嵌套XML,因为它不是有效的XML。
无论如何,您的XSLT的主要问题是您使用的value-of
应该使用apply-templates
:
<xsl:template match="Page/Content">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:apply-templates select="par"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:template>
<xsl:template match="par">
<p><xsl:apply-templates /></p>
</xsl:template>
<xsl:template match="b">
<strong><xsl:apply-templates /></strong>
</xsl:template>
<xsl:template match="i">
<em><xsl:apply-templates /></em>
</xsl:template>
但是,您没有向我们展示您想要的输出,因此我不确定这是否能完全解决您的问题。