在这个问题上的变化已张贴,但我找不到任何解决的基本情况。 我认为这将是很好的一个典型答案的问题的最简单的版本。 这个问题是假设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>
其中,直到我想使用禁用输出转义=“是”,这是XSL的一个属性的伟大工程:价值的。 有没有一种方法来选择混合节点的文本部分,我可以适用价值的嵌入式节点的独立?
这当然不行,因为我会失去子节点:
<xsl:template match="paragraph">
<p><xsl:value-of select="." disable-output-escaping="yes"/></p>
</xsl:template>
我知道我想做这可能代表了我处理XML的方式固有的问题,但许多XML的是由(信任)用户输入相当,天真地产生的事实,而我试图避免大量的XSLT-> HTML形式(如果可能)的XML-之间额外的处理代码>。
如果我理解你的权利,你想文本节点出来作为文字文本( 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>
我有一个类似的方案来处理(混合文本和节点内容处理节点); 这真的帮助: XSLT混合内容节点