已发布此问题的变体,但我找不到任何解决基本情况的问题 . 我认为对问题的最简单版本有一个规范的答案会很好 . 这个问题假设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 回答
如果我理解你正确,你希望文本节点作为文字文本出现(
disable-output-escaping="yes"
),但转换的其余部分应该正常工作(<bold>
到<b>
等)模板模式可以帮助:
我有一个类似的场景要处理(处理具有混合文本和节点内容的节点);这确实有帮助:XSLT mixed content node