2013-03-20 65 views
9

Tôi muốn thêm một số CDATA thẻ xung quanh một số thẻ xmlThêm CDATA vào một tập tin xml

nguồn XML là (nó chỉ là một phần nhỏ của tập tin của tôi)

<teaserText_fr> 
<div xmlns:xlink="http://www.w3.org/1999/xlink xmlns="http://www.coremedia.com/2003/richtext-1.0"><p>2012 ist für viele Länder ein wichtiges Wahljahr. Die Reihe fühlt der weltweiten Demokratie auf den Zahn. </p> 
</div> 
</teaserText_fr> 

Những gì tôi muốn được

<teaserText_fr> 
<![CDATA[ 
<div xmlns:xlink="http://www.w3.org/1999/xlink"  xmlns="http://www.coremedia.com/2003/richtext-1.0"><p>2012 ist für viele Länder ein wichtiges Wahljahr. Die Reihe fühlt der weltweiten Demokratie auf den Zahn. </p> 
</div> 
]]> 
</teaserText_fr> 

XSLT của tôi là

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output 
    method="html" 
    encoding="UTF-8" 
    omit-xml-declaration="yes" 
    doctype-public="-//W3C//DTD HTML 4.01//EN" 
    doctype-system="http://www.w3.org/TR/html4/strict.dtd" 
    indent="yes" /> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="teaserText_fr"> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="*"/>  
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

Những gì tôi nhận được là

</teaserText_de><![CDATA[<div xmlns="http://www.coremedia.com/2003/richtext-1.0" xmls:xlink="http://www.w3.org/1999/xlink"><p>à partir du 10 janvier, ARTE diffuse "I love democracy", une série documentaire qui, en cette grand année électorale, prend le pouls démocratique de la planète.</p></div>]]><addTeaserText_de> 

Tôi mất teaserText_fr thẻ của tôi, tôi không hiểu tại sao

Nếu có thể, tôi muốn làm như vậy đối với một số thẻ phụ (với regexp như [add|]TeaserText_[fr|de] nhưng tôi không thể làm cho nó hoạt động ... "

Tôi đã thực hiện một số thử nghiệm cả ngày nhưng tôi không thành công đầy.

Trân trọng, Guillaume

Trả lời

13

Bạn có thể cần phải làm điều này:

<xsl:template match="teaserText_fr"> 
    <xsl:copy> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="*"/>  
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
    </xsl:copy> 
</xsl:template> 

Hoặc này:

<xsl:template match="teaserText_fr"> 
    <teaserText_fr> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="*"/>  
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
    </teaserText_fr> 
</xsl:template> 

(Tôi khuyên bạn nên cách tiếp cận đầu tiên)

và bạn nên được tất cả các thiết lập.

Để cung cấp cho điều trị tương tự cho bất kỳ yếu tố có tên bắt đầu với "teaserText_":

<xsl:template match="*[starts-with(local-name(), 'teaserText_')]"> 
    <xsl:copy> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="*"/>  
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
    </xsl:copy> 
</xsl:template> 
+0

Cảm ơn JLRishe, nó hoạt động với cách tiếp cận đầu tiên của bạn (ngay cả khi tôi không hiểu hết). Làm thế nào tôi có thể thêm regexp để có kết quả tương tự cho teaserTest_de bằng ví dụ. – glmrenard

+2

Tất cả những gì tôi đã làm là thêm một bản sao 'xsl: copy' làm một bản sao nông nút bối cảnh (trong trường hợp này, đó là một' teaserText_fr'). Về cơ bản, khi nút hiện tại là một phần tử, nó sẽ đặt các thẻ cho phần tử hiện tại xung quanh những gì bên trong. Tôi không chắc bạn cần regex để xử lý "teaserText_de"; làm thế nào về các mẫu tôi đã thêm vào cuối câu trả lời của tôi? – JLRishe

2

Một cách tiếp cận sạch sẽ tận dụng cdata-section-yếu tố

Delcare teaserText_fr trong phần tử cdata-section như bên dưới

<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-16" 
standalone="yes" cdata-section-elements="teaserText_fr" /> 

Sau đó, định dạng XSLT như dưới đây. (Lưu ý rằng bạn phải bao gồm CDATA như một trình bao bọc xung quanh phần tử)

<xsl:template match="/"> 
    <teaserText_fr> 
     <![CDATA[ 
      <div xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.coremedia.com/2003/richtext-1.0"><p>2012 ist für viele Länder ein wichtiges Wahljahr. Die Reihe fühlt der weltweiten Demokratie auf den Zahn. </p> 
      </div> 
     ]]> 
    </teaserText_fr> 
</xsl:template> 
Các vấn đề liên quan