2008-10-08 172 views
12

我有一個這樣的xsl:text節點與內容的XSL樣式表:用xsl:text解釋換行符?

<xsl:text> 
foo 
bar 
baz 
</xsl:text> 

樣式表本身是「UNIX風格」換行符行終止的文本文件。我在Windows上調用這個樣式表以及類似unix的平臺。如果輸出符合調用它的平臺的約定,那將是非常好的。

當我在Windows上運行此樣式表時,輸出具有回車/換行對的所有內容,除節點的內容爲xsl:text

我可以指示XSLT處理器將xsl:text節點的內容中的換行字符轉換爲平臺特定的行尾?

更多上下文:我是從Apache Ant 1.7.1 XSLT task這樣調用樣式表:

<xslt in="in.xml" out="out.xml" style="stylesheet.xsl"/> 

樣式表頭目前看起來是這樣的:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xalan="http://xml.apache.org/xslt" 
    exclude-result-prefixes="xalan"> 
    <!-- contents elided --> 
</xsl:stylesheet> 

回答

1

林不知道該怎麼做了正確的自動換行符(它可能取決於您使用的xslt處理器),但是您可以在文本節點的內容中強制換行符。 \ r \ n是&#xD; &#xA;,\ n是&#xA;,例如,你會使用:

<xsl:text>foo&#xD;&#xa;bar&#xD;&#xa;</xsl:text>以獲得您要查找的輸出。

+0

感謝您的回答!是的,我認爲我可以做到這一點,但是在類Unix環境中輸出會出錯!我不希望以某種方式對它進行硬編碼,而是希望它「做正確的事情」,而不管它被調用的地方。也許我應該在問題中澄清這一點。再次感謝。 – 2008-10-08 22:53:02

5

你可以定義一個參數的樣式,像這樣:

<xsl:param name="br"> 
    <xsl:text>&#10;</xsl:text> 
</xsl:param> 

,並在Ant腳本使用嵌套param元素的行字符(S)的適當的最終通過。當然,這個例子中的默認值是一個Unix樣式的換行符。我想輸出的價值,你必須使用:

<xsl:copy-of select="$br"/> 

這是冗長的,但它的作品。

+0

感謝您的回答!這是個好主意,但我不認爲xsl:copy-of可以嵌入到xsl:text的主體中。可以用param來定義一個實體嗎?我可以嵌入像<,&myeol;?這是如何完成的?理想情況下,我希望有一種方法可以在不通過參數傳遞EOL的情況下執行此操作。 – 2008-10-09 16:35:50

4

如果您呼叫從螞蟻的變換,然後you can test for the OS using a conditional task with a test for the OS family

<condition property="linebreak" value="&#xD;&#xa;"> 
     <os family="windows"/> 
    </condition> 
    <condition property="linebreak" value="&#xa;"> 
     <os family="unix"/> 
    </condition> 

然後該參數傳遞給XSLT信號要使用的換行符(S)。

<xslt in="data.xml" out="${out.dir}/out.xml"> 
    <param name="linebreak" expression="${linebreak}" /> 
</xslt> 
0

嗯,我得到了我到(使用撒克遜)與上述2個思想工作相結合:用線(S),像這樣在需要的地方

<xsl:param name="br"> 
     <xsl:text>&#xD;&#xa;</xsl:text> 
</xsl:param> 

,然後。

<xsl:value-of select="$br" /> 

這裏是我的全部(但超薄)XSL

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!--<xsl:strip-space elements="*" />--> 
    <xsl:output method="text" /> 
    <!-- <xsl:preserve-space elements="*"/>--> 
<xsl:param name="br"> 
     <xsl:text>&#xD;&#xa;</xsl:text> 
</xsl:param> 


    <!-- --> 
    <xsl:template match="/"> 


    <xsl:for-each select="//root/Item"> 

     <xsl:value-of select="@Name" /> <!-- Your xpath will vary of course! --> 
     <xsl:value-of select="$br" /> 

    </xsl:for-each> 

</xsl:template> 

,我再次使用撒克遜 的%ProgramFiles%\ SaxonHE \在Windows 7 BIN \ Transform.exe x64機器。