使用disable-output-escaping转换XML混合节点

时间:2009-08-26 14:47:54

标签: xml xslt

此问题的变更已发布,但我找不到任何解决基本情况的问题。我认为对问题的最简单版本有一个规范的答案会很好。这个问题假定为xslt 1.0。

我有一个包含混合节点的XML文档,例如:

<paragraph>
     This is some text that is <bold>bold</bold> 
     and this is some that is <italic>italicized.</italic>
</paragraph>

我通常会使用类似这样的转换:

<xsl:template match="bold">
    <b><xsl:apply-templates/></b>
</xsl:template>
<xsl:template match="italic">
    <i><xsl:apply-templates/></i>
</xsl:template>
<xsl:template match="paragraph">
    <p><xsl:apply-templates/></p>
</xsl:template>

在我想使用disable-output-escaping =“yes”之前效果很好,这是xsl:value-of的一个属性。有没有办法选择混合节点的文本部分,我可以应用独立于嵌入节点的值?

这当然不起作用,因为我会丢失子节点:

<xsl:template match="paragraph">
    <p><xsl:value-of select="." disable-output-escaping="yes"/></p>
</xsl:template>

我知道我试图这样做的事实可能代表了我处理XML的方式中的一个固有问题,但是大部分XML都是由(可信的)用户输入相当天真地生成的,我正在尝试避免XML-&gt; XSLT-&gt; HTML表单之间的大量额外处理代码(如果可能的话)。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望文本节点作为文字文本(disable-output-escaping="yes")出现,但转换的其余部分应该正常工作(<bold><b>等。 )

模板模式可以提供帮助:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" />

  <xsl:template match="paragraph">
    <p>
      <xsl:apply-templates mode="literal" />
    </p>
  </xsl:template>

  <!-- literal templates (invoked in literal mode) -->
  <xsl:template match="bold" mode="literal">
    <b><xsl:apply-templates mode="literal"/></b>
  </xsl:template>
  <xsl:template match="italic" mode="literal">
    <i><xsl:apply-templates mode="literal"/></i>
  </xsl:template>
  <xsl:template match="text()" mode="literal">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <!-- normal templates (invoked when you don't use a template mode) -->
  <xsl:template match="bold">
    <b><xsl:apply-templates /></b>
  </xsl:template>
  <xsl:template match="italic">
    <i><xsl:apply-templates /></i>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

我有一个类似的场景要处理(处理具有混合文本和节点内容的节点);这确实有帮助:XSLT mixed content node