XSLT (1.0) 如何在 CDATA 标签中包装元素值时保留 html 标签

XSLT (1.0) How to preserve html tags when wrapping element value in a CDATA tag

我有一个 XML 文本元素,可以包含标记的文本,根据元素属性值,我知道内容是 CDATA 封装的还是 XHTML。

因为我不能 have/create Text 元素中的任何子元素,如果我得到 XHTML,我将需要封装。

这只是我需要在 XSLT 中转换的众多元素之一

一小段xml样本

  <ONIXMessage release="3.0" xmlns="http://ns.editeur.org/onix/3.0/reference">
  <Product>
    <CollateralDetail>
      <TextContent>
        <Text textformat="05">
          <p>Requires internet connection for purchase, plus iPod or other Audible-compatible player or iTunes software on Mac OS X or Windows</p>
        </Text>
      </TextContent>
    </CollateralDetail>
  </Product>
  <Product>
    <CollateralDetail>
      <TextContent>
        <Text textformat="02"><![CDATA["Nogle dyr er farlige. Nogle dyr kan slå dig ihjel!"
Hvis det stod til Claras mor, var Clara aldrig blevet vildheks. Hun er bange for at Clara skal komme noget til, og det viser sig at der er en god grund. Den vilde verden ER et farligt sted – ikke mindst nu hvor Bravita Blodsunge er ved at bryde fri af det fængsel der har holdt hende fanget i 400 år ...

"Blodsungen" er fjerde bog i serien om Clara, hendes kærlighed til dyr og hendes kamp for at overleve som vildheks i en verden hvor magi ikke ligefrem er barnemad.]]></Text>
      </TextContent>
    </CollateralDetail>
  </Product>
</ONIXMessage>

我终于尝试了这个,它确实以某种方式实现了目标。只是 html 标签没有保留。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
 xmlns:onix="http://ns.editeur.org/onix/3.0/reference"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl onix xsi">

    <xsl:output method="xml" indent="no" omit-xml-declaration="yes" />
<!--  cdata-section-elements="onix:BiographicalNote onix:Text" -->
    <xsl:template match="@* | node() ">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="//onix:TextContent/onix:Text ">
        <xsl:choose>
            <xsl:when test="//onix:TextContent/onix:Text/@textformat='05'">
                <xsl:element name="Text" xmlns="http://ns.editeur.org/onix/3.0/reference" >
                <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
                    <xsl:value-of select="current()"/>
                <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="current()"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

这将产生以下内容(注意第一个文本中的

标签已消失)

<ONIXMessage release="3.0" xmlns="http://ns.editeur.org/onix/3.0/reference">
  <Product>
    <CollateralDetail>
      <TextContent>
        <TextType>11</TextType>
        <ContentAudience>02</ContentAudience>
        <Text><![CDATA[
          Requires internet connection for purchase, plus iPod or other Audible-compatible player or iTunes software on Mac OS X or Windows
        ]]></Text>
      </TextContent>
    </CollateralDetail>
  </Product>
  <Product>
    <CollateralDetail>
      <TextContent>
        <TextType>03</TextType>
        <ContentAudience>00</ContentAudience>
        <Text><![CDATA["Nogle dyr er farlige. Nogle dyr kan slå dig ihjel!"
Hvis det stod til Claras mor, var Clara aldrig blevet vildheks. Hun er bange for at Clara skal komme noget til, og det viser sig at der er en god grund. Den vilde verden ER et farligt sted – ikke mindst nu hvor Bravita Blodsunge er ved at bryde fri af det fængsel der har holdt hende fanget i 400 år ...

"Blodsungen" er fjerde bog i serien om Clara, hendes kærlighed til dyr og hendes kamp for at overleve som vildheks i en verden hvor magi ikke ligefrem er barnemad.]]></Text>
      </TextContent>
    </CollateralDetail>
  </Product>
</ONIXMessage>

我也试过用 cdata-section-elements="onix:Text"

但是输出变得非常奇怪,因为 1 个元素的输出中有多个 cdata 标记,它唯一没有封装的实际上是我想要封装的文本

<BiographicalNote textformat="05"><![CDATA[
  ]]><p>A crime writer for over thirty years, Ruth Rendell has won one Crime Writers’ Association Silver Dagger Award, two Gold Daggers and, the supreme accolade, the Crime Writers’ Diamond Award for her outstanding contribution to the genre.</p><![CDATA[
]]></BiographicalNote>

我如何解决我需要实现的目标? 为什么当我尝试将文本封装在我所做的代码中时,html 标记从元素值中删除(..这甚至是正确的方法吗?!)

谢谢蒂姆 Chttps://whosebug.com/users/7585/tim-c

看来我没有完全理解value-of的本质 解决方案非常接近。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
 xmlns:onix="http://ns.editeur.org/onix/3.0/reference"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl onix xsi">

    <xsl:output method="xml" indent="no" omit-xml-declaration="yes" />
<!--  cdata-section-elements="onix:BiographicalNote onix:Text" -->
    <xsl:template match="@* | node() ">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="//onix:TextContent/onix:Text ">
        <xsl:choose>
            <xsl:when test="//onix:TextContent/onix:Text/@textformat='05'">
                <xsl:element name="Text" xmlns="http://ns.editeur.org/onix/3.0/reference" >
                <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
                    <xsl:copy-of select="node()"/>
                <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="current()"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>