我有一个带有Text元素的XML,该XML元素可以包含带标签的文本,并且根据elements属性值,我知道内容是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标签(..甚至是正确的方法吗?!)
答案 0 :(得分:1)
谢谢Tim C https://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"><![CDATA[</xsl:text>
<xsl:copy-of select="node()"/>
<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>