2013-12-16 74 views
0

我一直在使用Altova Map Force最近構建XSL轉換,並且遇到了一個問題。爲了創建一個有效的XML輸出文件(來自一個輸入文本文件,它足夠簡單的構建),它需要包含一些xmlns屬性標記。在XSLT中將XML轉換爲字符串(CDATA)

不幸的是,我無法在Map Force或我的數據轉換工具(由我爲此構建的客戶端,基於Saxon構建的客戶端)內有效地執行此操作(修改輸出xsd模式def和屬性強制)。所以,我的解決方案是將生成的XML解析爲另一個(最終)轉換器,其中文件的XML元素被轉換爲包含XML的字符串表示(即返回的文件字符串)的單個文本塊,然後修剪關閉父元素聲明,並使用修改後的元素(使用xmlns屬性)對其進行修改,然後將其輸出以進行保存。

我已經做了一些測試,我可以有效地做到這一點,但在該測試中,我解析了一個預先轉換的xml字符串,該函數應用了該函數。所以,任何人都可以告訴我,在xslt內,我可以將元素集合轉換爲一個字符串,我可以修改並返回爲CDATA(轉換器程序將轉換爲字符串並將其直接轉儲到輸出文件)?

+0

我太想你應該專注這裏的* real *問題(「它需要包含一些xmlns屬性標籤」),而不是過分詳細的解決方法。 –

回答

1

Altova產品線的最新版本支持XPath 3.0功能,如http://www.w3.org/TR/xpath-functions-30/#func-serialize,因此假設您需要的只是例如

<xsl:output cdata-section-elements="foo"/> 

<xsl:template match="bar"> 
    <foo><xsl:value-of select="serialize(.)"/></foo> 
</xsl:template> 

Saxon的商業版本也支持該功能,我認爲(如果你使用version="3.0"爲你的樣式表)。

但是,您可能希望在單獨的問題中發佈真實的問題描述(需要輸入,需要輸出),以便我們可以確定您是否真的需要使用迄今概述的方法來確保您確定名稱空間聲明。

+0

很想發佈完整的細節,但我可能會遇到一些麻煩,nda和那:(但這聽起來不錯,但我最近更新到最新版本的Altova任務套件(發佈的一個關於我在MapForce中找不到任何對serialize函數的引用,可能會被調用別的東西嗎?不幸的是,AFAIK只能從MapForce創建XSLT,而不是反過來:( – topherg

+0

http://www.altova .com /說「XPath/XSLT/XQuery 3.0支持」和Raptor的文檔http://manual.altova.com/RaptorXML/raptorxmlserver/index.html?xsxqengine_xpxq3fx.htm說:「XPath和XQuery 3.0函數和運算符支持的RaptorXML服務器符合萬維網聯盟(W3C)2013年5月21日的XPath和XQuery函數和操作符3.0推薦標準。「並列出了'serialize'函數。我認爲MapForce將Raptor用於XSLT,並且該方式應該支持福nction。但我自己不使用MapForce,所以我無法檢查。 –

+0

我剛剛瀏覽了MapForce在線文檔,它確實看起來好像它的功能支持僅限於XSLT和XPath 2.0,所以我使用'serialize'的建議可能確實不起作用。 –

0

成功,我不得不修改XSD架構和設置targetNamespace來一樣xmlns在架構,與elementFormDefault="qualified"一起,並修改了輸出XML到相應的響應