2012-12-27 68 views
0

顏色對象我在XSL新的,我有一個代表INT RGB顏色, 我想使用XSL將其轉換爲彩色物體標籤標記的XML文件:變換int值中使用XSL和Java

我的XML包含這些標籤

<?xml version="1.0" encoding="UTF-8"?> 
. 
. 
. 
<ForeGroundColour>-16776961</ForeGroundColour> 
. 
. 
. 
</xml> 

所需的XML是:

<ForeGroundColour> 
    <red>102</red> 
    <blue>102</blue> 
    <green>255</green> 
    <alpha>255</alpha> 
</ForeGroundColour> 

我的XSL文件是:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:Color="java.awt.Color" 
    xmlns:Integer="java.lang.Integer" exclude-result-prefixes="Color Integer "> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 

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

    <xsl:template match="//*[contains(name(),'ForegroundColour')]"> 
     <xsl:copy> 
      <xsl:variable name="rgb" select="." /> 
      <xsl:variable name="color" select="Color:new(Integer:parseInt($rgb))" /> 
      <xsl:element name="red"> 
       <xsl:value-of select="Color:getRed($color)" /> 
      </xsl:element> 
      <xsl:element name="blue"> 
       <xsl:value-of select="Color:getBlue($color)" /> 
      </xsl:element> 
      <xsl:element name="green"> 
       <xsl:value-of select="Color:getGreen($color)" /> 
      </xsl:element> 
      <xsl:element name="alpha"> 
       <xsl:value-of select="Color:getAlpha($color)" /> 
      </xsl:element> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

我有兩個問題:

1 - 當我運行這段代碼,我得到以下異常:

Exception in thread "main" java.lang.VerifyError: (class: transformer, method: template$dot$1 signature: (Lcom/sun/org/apache/xalan/internal/xsltc/DOM;Lcom/sun/org/apache/xml/internal/dtm/DTMAxisIterator;Lcom/sun/org/apache/xml/internal/serializer/SerializationHandler;I)V) Expecting to find double on stack 
    at java.lang.Class.getDeclaredConstructors0(Native Method) 
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) 
    at java.lang.Class.getConstructor0(Class.java:2699) 
    at java.lang.Class.newInstance0(Class.java:326) 
    at java.lang.Class.newInstance(Class.java:308) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getTransletInstance(TemplatesImpl.java:364) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.newTransformer(TemplatesImpl.java:394) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:649) 
    at com.nyfix.ostp.server.workspacemigrator.XMLTransformer.transform(XMLTransformer.java:44) 
    at com.nyfix.ostp.server.workspacemigrator.XSLMigrator.migrate(XSLMigrator.java:45) 
    at com.nyfix.ostp.server.workspacemigrator.WorkspaceMigratorFactory.<init>(WorkspaceMigratorFactory.java:19) 
    at com.nyfix.ostp.server.workspacemigrator.WorkspaceMigratorFactory.main(WorkspaceMigratorFactory.java:45) 

2 - 當我使用的模板僅僅是爲了測試插入節點,

     <ForegroundColour> 
<red>-16776961</red> 
<blue>-16776961</blue> 
<green>-16776961</green> 
<alpha>-16776961</alpha> 
</ForegroundColour> 
<xsl:template match="//*[contains(name(),'ForegroundColour')]"> 
    <xsl:copy> 
     <xsl:variable name="rgb" select="." /> 
     <xsl:element name="red"> 
      <xsl:value-of select="$rgb" /> 
     </xsl:element> 
     <xsl:element name="blue"> 
      <xsl:value-of select="$rgb" /> 
     </xsl:element> 
     <xsl:element name="green"> 
      <xsl:value-of select="$rgb" /> 
     </xsl:element> 
     <xsl:element name="alpha"> 
      <xsl:value-of select="$rgb" /> 
     </xsl:element> 
    </xsl:copy> 
</xsl:template> 

xml將無壓痕轉化

任何人都可以幫助我嗎?在此先感謝

+0

最可能的是,你並不需要擴展功能,在所有特殊間距。請編輯*問題並描述從一個整數產生RGB的算法 - 那麼很可能很多讀者會提供一個純粹的XSLT解決方案。 –

+0

爲了從一個整數值中產生java Color對象,我們只需要調用新的Color(整數),它在XSL中被描述爲 bolbol

+0

bolbol,我問的是這個擴展函數使用的*算法*這可以直接在XSLT中實現 - 在大多數這種情況下不需要擴展函數。 –

回答

0

XSLT變量只能包含字符串,布爾值,數字或節點集 - Color:new(...)調用返回一個Java對象,該對象不能分配給XSLT變量,因此是例外。

可能的解決方案:

1)方法stringToRedstringToBlue等規定讓他們接受一個字符串創建自己的擴展類,在內部將其轉換爲Color對象,然後提取有用成分(紅色,藍色等)作爲數字或字符串。這些函數然後可以直接使用:

<xsl:element name="red"> 
    <xsl:value-of select="MyColorFunctions:stringToRed(.)" /> 
</xsl:element> 

2)「反向工程」,其將一個顏色表示爲整數爲組成它的算法,和在XSLT直接實現它,而無需使用擴展功能。通常情況下,紅色分量將是8個最不重要的位,藍色的下一個8位等等(反之亦然),你必須處理負值(從2-complement轉換爲絕對值) - 所以像這樣:

<xsl:variable name="color"> 
    <xsl:choose> 
     <xsl:when test="number(.) &gt;=0"> 
     <xsl:value-of select="number(.)"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="4278190080+number(.)"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:variable> 
    <red> 
    <xsl:value-of select="floor($color mod 256)" /> 
    </red> 
    <green> 
    <xsl:value-of select="floor(($color div 256) mod 256)" /> 
    </green> 
    <blue> 
    <xsl:value-of select="floor(($color div 65536) mod 256)" /> 
    </blue> 
    <alpha> 
    <xsl:value-of select="floor(($color div 16777216) mod 256)" /> 
    </alpha> 

這個apprach的問題是,XSLT使用浮點arithmentic,所以它是可能的舍入誤差會導致在某些情況下,組件錯誤的值。

+0

感謝Mimo的迴應,我用第一種方法來解決問題,但是對於縮進,我在我的xsl文件中使用了,問題是文檔中已經存在的標籤是縮進的,但節點和我插入的節點並不是 – bolbol

+0

@bolbol:不客氣。關於縮進:'indent =「yes」'指令適用於由XSLT生成的所有內容 - 但它只在XSLT的輸出是字符串或文件時起作用,如果輸出是XML DOM對象,被忽略 - 也許這是你的問題? – MiMo

+0

我認爲這正是我的問題,你有任何線索如何解決它? – bolbol

0

這是一個有點晚來回答這個問題,但它是人誰可以有同樣的問題,

爲indenation問題,我不得不使用定製的XSL模板,以確保輸出XML是indentend在我想要的方式。

模板包括許多骯髒的代碼,迫使XML標記有模擬壓痕

希望這有助於:)