【问题标题】:How to parse "invalid" nested XML tags如何解析“无效”的嵌套 XML 标记
【发布时间】:2013-05-03 10:31:40
【问题描述】:

我正在尝试为 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" 以便正确显示&lt;b&gt;&lt;i&gt; 标签?

我尝试过类似的东西

<xsl:template match="par">
  <p>
  <xsl:apply-templates select="i"/>
  <xsl:apply-templates select="b"/>
  <xsl:value-of select="." /></p>
</xsl:template>

但这总是会导致输出顺序不正确,因为&lt;i&gt;&lt;b&gt; 标记显示在完整段落之前。 有没有可能在不改变原始 XML 格式的情况下做到这一点?

【问题讨论】:

    标签: xml xslt tags nested


    【解决方案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>
    

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

    【讨论】:

    • 感谢您的快速回答。这似乎确实解决了我的问题。事实上,我错误地认为 XML 无效,这似乎是不真实的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2023-04-05
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    相关资源
    最近更新 更多