2016-05-18 56 views
1

我使用xslt 2.0並使用copy-of來複制大多數XML。XSLT拷貝和字符8211

我有這樣的XML(這是有問題的部分):

<nitf> 
<body> 
<table class="4-col"> 
<tr><td>Sarpsborg &#8211; Høvik</td><td>6</td><td>-</td><td>8</td> 
</tr> 
</table> 
</body> 
</nitf> 

這裏是XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:output indent="yes" media-type="text/xml" method="xml" encoding="ISO-8859-15" /> 

<xsl:template name="createBody"> 
    <xsl:copy-of select="/nitf/body" /> 
</xsl:template> 

輸出爲:

<nitf> 
<body> 
    <table class="4-col"> 
     <tr> 
      <td>Sarpsborg &#x2013; Høvik</td> 
      <td>6</td> 
      <td>-</td> 
      <td>8</td> 
     </tr> 
    </table> 
</body> 
</nitf> 

預期的輸出應該是:

<nitf> 
<body> 
    <table class="4-col"> 
     <tr> 
      <td>Sarpsborg &#8211; Høvik</td> 
      <td>6</td> 
      <td>-</td> 
      <td>8</td> 
     </tr> 
    </table> 
</body> 
</nitf> 

解決方案

感謝Martin Honnen我能夠通過添加參考了一些撒克遜擴展以獲得正確的輸出。因爲我們有商業許可證,所以我可以使用這個擴展。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:saxon="http://saxon.sf.net/" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

然後添加以下到了xsl: 可以通過添加撒克遜命名樣式表根節點添加它輸出元素:撒克遜:字符表示=「十進制」 你的輸出應再像這個(或至少我的是):

<xsl:output indent="yes" encoding="ISO-8859-15" saxon:character-representation="decimal" /> 

馬丁Honnen被鏈接到這個擴展在他的回答,所以請不要對如何推廣工作讀了。

回答

2

XSLT處理器使用XML解析器將輸入XML解析爲具有Unicode字符的節點樹。該樹根本不包含任何字符引用,只是字符。如果您將文本節點複製到輸出並將輸出序列化爲文件,那麼XSLT處理器序列化文本節點並按序列化規則和編碼所需的方式轉義任何字符。所選輸出編碼中無法表示的Unicode字符將根據需要進行轉義,但編碼選擇(即十六進制或十進制)取決於XSLT處理器。

如果您使用Saxon的商業版本,請參閱http://saxonica.com/html/documentation/extensions/output-extras/serialization-parameters.html並嘗試設置<xsl:output saxon:character-representation="decimal" xmlns:saxon="http://saxon.sf.net/"/>,以強制實施十進制表示法。

如果您確實需要保留字符引用,那麼您需要預處理XML,例如LexEv http://andrewjwelch.com/lexev/,以將它們變爲可以處理的標記。

+0

這真是太棒了。它輕鬆解決了我的問題。 – Trond