2013-02-27 55 views
0

我有XML文件類似於以下XML轉換排序,並保持CDATA標籤

<?xml version="1.0" encoding="UTF-8"?> 
<domData CHECK_STATE="P"> 
    <K> 
    <![CDATA[F]]> 
    </K> 
    <P> 
    <![CDATA[F]]> 
    </P 
    <L> 
    <![CDATA[F 
    CC 
    DD 
    GEJ]]> 
    </L> 
    <D/> 
    <E/> 
    <A>TEST</A> 
    <B> 
    <![CDATA[<root><iA>DATA</iA><iB>DDDD</iB><</root>]]> 
    </B> 
</domData> 

和我有以下改造

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

      <xsl:apply-templates select="node()"> 
       <xsl:sort select="name()"> 
       </xsl:sort> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

上述改造刪除所有CDATA和逃逸內部XML實體。

我不能使用「cdata-section-elements」作爲數字元素是巨大的,我也想爲不同的XML文件使用相同的xslt。

我的問題是,我需要保持CDATA標籤和內部xml,因爲它是。 有可能嗎? THX

回答

0

我不能用「CDATA段元素」的元素數量是巨大的,我想用不同的XML文件相同的XSLT爲好。

cdata-section-elements是製作XSLT輸出CDATA部分的唯一標準方法。當然,不可能像在輸入文檔中一樣保留CDATA部分,因爲有關哪些文本節點最初是CDATA部分的信息以及純文本節點在XPath數據模型中是不可用的。但是它不應該是必須的,因爲CDATA部分只是一個語法糖,並且就任何XML處理器而言,它們完全等同於實體轉義形式。

您可能會使用特定於處理器的技巧,但取決於您將使用哪種XSLT處理器。如果您不希望考慮使用諸如DOM之類的對象模型的非XSLT解決方案,那麼可以將其配置爲保留原始CDATA結構。

0

如果CDATA標籤傳達信息,則首先將其替換爲XSLT理解並保留在數據模型中的其他內容。您可以在XSLT處理的輸入端使用SAX篩選器通過執行此操作,並且可以在輸出端的類似篩選器傳遞中將元素轉換回CDATA標記。

但是,任何使用CDATA區段邊界攜帶信息的人都應該被拍攝。