首页 文章

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

提问于
浏览
3

已发布此问题的变体,但我找不到任何解决基本情况的问题 . 我认为对问题的最简单版本有一个规范的答案会很好 . 这个问题假设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-> XSLT-> HTML表单之间的额外处理代码(如果可能) .

2 回答

  • 0

    如果我理解你正确,你希望文本节点作为文字文本出现( 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>
    
  • 2

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

相关问题