0

我正在尝试为 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>and<b>标记显示在完整段落之前。有没有可能在不改变原始 XML 格式的情况下做到这一点?

4

1 回答 1

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>

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

于 2013-05-03T10:36:01.527 回答