我如何在 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">&lt;h1&gt;Headline&lt;/h1&gt;
         &lt;h2 style="color:green"&gt; Grüne Schrift &lt;/h2&gt;
         &lt;h3 style="color:black"&gt; Schwarze Schrift &lt;/h3&gt;
         &lt;h4 style="color:#FF0000"&gt; Rote Schrift &lt;/h4&gt;</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">&lt;![CDATA[</xsl:text>
        <div class="{$noteClass}">
        <xsl:apply-templates/>
        </div>
        <xsl:text disable-output-escaping="yes">]]&gt;</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>&lt;<div class="html-content">&lt;h1&gt;Headline&lt;/h1&gt;&lt;h2 style="color:green"&gt; Grüne Schrift &lt;/h2&gt;
&lt;h3 style="color:black"&gt; Schwarze Schrift &lt;/h3&gt;
&lt;h4 style="color:#FF0000"&gt; Rote Schrift &lt;/h4&gt;</div>]]&gt;</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>&lt;h1&gt;Headline&lt;/h1&gt;&lt;h2 style="color:green"&gt; Grüne Schrift &lt;/h2&gt; &lt;h3 style="color:black"&gt; Schwarze Schrift &lt;/h3&gt; &lt;h4 style="color:#FF0000"&gt; Rote Schrift &lt;/h4&gt;</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 部分。