当前位置: 首页 > 知识库问答 >
问题:

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

嵇光临
2023-03-14

我有一个带有文本元素的XML,它可以包括标记的文本,并且取决于元素属性值,我知道内容是CDATA封装的还是XHTML。

因为我不能在文本元素中拥有/创建任何子元素,所以如果我得到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节元素=“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标签从元素值中删除(...

共有1个答案

杨轶
2023-03-14

谢谢Tim Chttps://stackoverflow.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>
 类似资料:
  • 我在CDATA标记中有一些XML格式的文本。XSLT将此数据放在列表属性名称中 有人能帮我解决这个问题吗?

  • 我试图用xml2js构建一个XML节点。当我添加包装在cdata中的html标签时,它会创建一个单独的节点,如下所示。如果我把CDATA包在里面"

  • 问题内容: 脚本标记中是否曾经需要 CDATA 标记?如果需要,何时? 换句话说,这是何时何地: 对此更可取: 问题答案: 如果您需要将文档以XML格式解析(例如,当XHTML页面被解释为XML格式) 并且您希望能够编写文字而不是and时,则需要CDATA部分,因为XHTML会将JavaScript代码解析为解析的字符数据与默认情况下的字符数据相反。这不是存储在外部源文件中的脚本的问题,但是对于X

  • 我想从. kml文件中提取值,以便使用R进行描述。 文件如下: 这是我想提取的,包含在 即。: xmlToList给我,我认为NULL,因为CDATA标记意味着以下内容不被解析器处理: 我认为这就是所谓的“CDATA这个术语是用来描述XML解析器不应该解析的文本数据……解析器会忽略CDATA节中的所有内容。CDATA节以“”开头 以下内容对我也不起作用,也许是出于与CDATA相关的同样原因: 有人

  • 我正在努力寻找一个很好的例子,说明如何将XML元素添加到XML文档中,并将数据(内部文本)添加到同一元素中,但将数据包装到CDATA标记中? 这是我需要的一个例子。我有以下文件。 然后我想添加一个元素和CDATA作为内部文本。所以它看起来像这样。我需要包装在CDATA标签中的数据可能相当大,需要从文件中读取/引用。 然后我需要写的变化到一个新的文档...(

  • 因此,我目前正在尝试找出,如果提供的数据模型不包含标记,是否可以保留该值。我知道,但这不适用于FreeMarker标记。 基本上,我想做的是: