- 和 3. 两者都需要在 1. 中进行包装和禁用输出转义。不会受到伤害,所以我认为您可以使用相同的模板将它们一起处理。
我没有看到一个明确的检查元素内容是否包含带有纯 XSLT 1.0 手段的转义元素标记,所以我只是尝试了
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="item[not(*) and not(starts-with(., '<') and substring(., string-length(.)) = '>')]">
<xsl:copy>
<p>
<xsl:value-of select="." disable-output-escaping="yes"/>
</p>
</xsl:copy>
</xsl:template>
<xsl:template match="item[not(*)
and starts-with(., '<') and substring(., string-length(.)) = '>']">
<xsl:copy>
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
转换
<root>
<item>some text</item>
<item><p>some text</p></item>
<item>some <em>text</em></item>
</root>
进入
<html><body>
<item><p>some text</p></item>
<item><p>some text</p></item>
<item><p>some <em>text</em></p></item>
</body></html>
显然它也会<item><...></item>
变成<item><...></item>
. 您可以尝试实现更多的字符串检查,但如果没有针对转义的 XML 片段的完整解析器,则始终可以在字符串检查失败的地方构造输入样本。