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