我如何在 xslt 中为 CDATA 的特殊元素设置异常
How do i set an exception in xslt for a special element for CDATA
事情是这样的。我有一个可以读取 XML 和 html 的查看器。现在我想要实现的是以下内容。我想将 <note>
中的文本转换为 CDATA(检查),但如果在 <note>
中使用了特定元素,*让我们调用元素 <html>
,该元素中的所有文本不应转换为 CDATA。
这可能吗?我已经尝试了不同的方法,但还没有找到对我的案子有帮助的解决方案。
输入数据是这样的:
<infobox>
<title>HTML TEST</title>
<note><b>XML in the Note</b><html html="yes"><h1>Headline</h1>
<h2 style="color:green"> Grüne Schrift </h2>
<h3 style="color:black"> Schwarze Schrift </h3>
<h4 style="color:#FF0000"> Rote Schrift </h4></html>
</note>
</infobox>
我的注释 XSL 部分是这样的:
<xsl:template match="note[not(ancestor::info) and not(ancestor::item-content) and not(ancestor::context)]">
<note type="{@type}">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<div class="{$noteClass}">
<xsl:apply-templates/>
</div>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</note>
</xsl:template>
我发布的结果是这样的:
<infobox>
<title id="CAP0e6ba25c-a8a1-45fb-a957-43c3195f9c326">HTML TEST</title>
<note type=""><![CDATA[<div class="NoteContent">
<b>XML in the Note</b>
<html><<div class="html-content"><h1>Headline</h1><h2 style="color:green"> Grüne Schrift </h2>
<h3 style="color:black"> Schwarze Schrift </h3>
<h4 style="color:#FF0000"> Rote Schrift </h4></div>]]></html>
</div>]]></note>
</infobox>
我想要发布的结果是这样的:
<infobox>
<title id="CAP0e6ba25c-a8a1-45fb-a957-43c3195f9c326">HTML TEST</title>
<note type=""><![CDATA[<div class="NoteContent">
<b>XML in the Note</b></div>]]><html><h1>Headline</h1><h2 style="color:green"> Grüne Schrift </h2> <h3 style="color:black"> Schwarze Schrift </h3> <h4 style="color:#FF0000"> Rote Schrift </h4></html>
</note>
</infobox>
所以你看,<html>
元素应该被排除在转换之外。
我愿意接受有关编辑显示的 xsl 部分或任何其他 xsl 输入的任何建议。
谢谢大家
选择非 html
元素并将它们包装在序列化的 div
中很容易在 XSLT 3 中实现:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="note/*[not(self::html)]">
<xsl:variable name="div-wrapper" as="element(div)">
<div class="note">
<xsl:apply-templates/>
</div>
</xsl:variable>
<xsl:value-of select="serialize($div-wrapper)"/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/a9GPfA
创建 CDATA 部分可以委托给 <xsl:output cdata-section-elements="note"/>
,参见 https://xsltfiddle.liberty-development.net/a9GPfA/1,但正如您所看到的那样,很难控制白色 space 中仅包含内容的内容note
,在您的示例中,您将在 html
元素之后得到一个带有白色 space 的 CDATA 部分。
事情是这样的。我有一个可以读取 XML 和 html 的查看器。现在我想要实现的是以下内容。我想将 <note>
中的文本转换为 CDATA(检查),但如果在 <note>
中使用了特定元素,*让我们调用元素 <html>
,该元素中的所有文本不应转换为 CDATA。
这可能吗?我已经尝试了不同的方法,但还没有找到对我的案子有帮助的解决方案。
输入数据是这样的:
<infobox>
<title>HTML TEST</title>
<note><b>XML in the Note</b><html html="yes"><h1>Headline</h1>
<h2 style="color:green"> Grüne Schrift </h2>
<h3 style="color:black"> Schwarze Schrift </h3>
<h4 style="color:#FF0000"> Rote Schrift </h4></html>
</note>
</infobox>
我的注释 XSL 部分是这样的:
<xsl:template match="note[not(ancestor::info) and not(ancestor::item-content) and not(ancestor::context)]">
<note type="{@type}">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<div class="{$noteClass}">
<xsl:apply-templates/>
</div>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</note>
</xsl:template>
我发布的结果是这样的:
<infobox>
<title id="CAP0e6ba25c-a8a1-45fb-a957-43c3195f9c326">HTML TEST</title>
<note type=""><![CDATA[<div class="NoteContent">
<b>XML in the Note</b>
<html><<div class="html-content"><h1>Headline</h1><h2 style="color:green"> Grüne Schrift </h2>
<h3 style="color:black"> Schwarze Schrift </h3>
<h4 style="color:#FF0000"> Rote Schrift </h4></div>]]></html>
</div>]]></note>
</infobox>
我想要发布的结果是这样的:
<infobox>
<title id="CAP0e6ba25c-a8a1-45fb-a957-43c3195f9c326">HTML TEST</title>
<note type=""><![CDATA[<div class="NoteContent">
<b>XML in the Note</b></div>]]><html><h1>Headline</h1><h2 style="color:green"> Grüne Schrift </h2> <h3 style="color:black"> Schwarze Schrift </h3> <h4 style="color:#FF0000"> Rote Schrift </h4></html>
</note>
</infobox>
所以你看,<html>
元素应该被排除在转换之外。
我愿意接受有关编辑显示的 xsl 部分或任何其他 xsl 输入的任何建议。
谢谢大家
选择非 html
元素并将它们包装在序列化的 div
中很容易在 XSLT 3 中实现:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="note/*[not(self::html)]">
<xsl:variable name="div-wrapper" as="element(div)">
<div class="note">
<xsl:apply-templates/>
</div>
</xsl:variable>
<xsl:value-of select="serialize($div-wrapper)"/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/a9GPfA
创建 CDATA 部分可以委托给 <xsl:output cdata-section-elements="note"/>
,参见 https://xsltfiddle.liberty-development.net/a9GPfA/1,但正如您所看到的那样,很难控制白色 space 中仅包含内容的内容note
,在您的示例中,您将在 html
元素之后得到一个带有白色 space 的 CDATA 部分。