如何解析“无效”嵌套XML标记

时间:2013-05-03 10:31:40

标签: xml xslt tags nested

我正在尝试为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">&lt;![CDATA[</xsl:text>
  <xsl:for-each select="par">
    <xsl:apply-templates select="."/>
  </xsl:for-each>
  <xsl:text disable-output-escaping="yes">]]&gt;</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格式的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

我没有在您的示例输入中看到任何错误的嵌套标记,因此我不确定您的意思。 XSLT无法处理错误的嵌套XML,因为它不是有效的XML。

无论如何,您的XSLT的主要问题是您使用的value-of应该使用apply-templates

<xsl:template match="Page/Content">
  <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
  <xsl:apply-templates select="par"/>
  <xsl:text disable-output-escaping="yes">]]&gt;</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>

但是,您没有向我们展示您想要的输出,因此我不确定这是否能完全解决您的问题。

相关问题