【发布时间】:2019-08-13 11:15:59
【问题描述】:
我有一个带有 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 标记(.. 这甚至是正确的方法吗?!)
【问题讨论】:
-
当您使用
<xsl:copy-of select="current()"/>而不是<xsl:value-of select="current()"/>时会发生什么? -
它将封装整个元素
购买需要互联网连接,以及 iPod 或其他兼容 Audible 的播放器或 Mac OS 上的 iTunes 软件X 或 Windows
]]> -
我认为这与我如何应用模板有关。问题是这只是完整 XSLT 中许多元素转换中的一种,我需要考虑所有因素。我真的是一个样式表新手 :-)
-
糟糕!我的意思是说 do
<xsl:copy-of select="node()"/>然后只会选择子节点。 -
嘭!!发现。它成功了。知道为什么 value-of 删除了标签(因为我认为这是基本问题)仅仅是该功能的性质吗?正如我所说,我是一个样式表新手。我想给你投票(如何?)