我有一个带有 Text 元素的 XML,它可以包含标记的文本,并且取决于元素属性值,我知道内容是 CDATA 封装还是 XHTML。
因为我不能在 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"><![CDATA[</xsl:text>
<xsl:value-of select="current()"/>
<xsl:text disable-output-escaping="yes">]]></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 标记(.. 这甚至是正确的方法吗?!)