2014-12-03 49 views
1

我有一個輸入XML文件:XSLT 2.0的錯誤處理:拋出異常的JavaScript

<Items> 
    <Item Name="1" Value="Value1"></Item> 
    <Item Name="2" Value="Value2"></Item> 
</Items> 

我想轉換成在與撒克遜-CE輸出文件的內容。

<Items> 
    <Item Name="1" Value="NewValue1"></Item> 
    <Item Name="2" Value="NewValue2"></Item> 
</Items> 

JS:

function TransformXML() { 
    xsltData = Saxon.requestXML("transformXML.xsl"); 
    xmlData = Saxon.requestXML("myxml.xml"); 
    var xsltProcessor = Saxon.newXSLT20Processor(xsltData); 
    var result = xsltProcessor.transformToDocument(xmlData); 
    } 

我有一個映射,告訴我它應該有改造後的項目,並設置爲newValue的價值。 我有什麼至今:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">      

    <xsl:strip-space elements="*" /> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" name="xml" /> 

    <xsl:variable name="Items"> 
     <Item Name="1"> 
      <Value OldValue="Value1" NewValue="NewValue1" ></Value> 
     </Item> 
     <Item Name="2"> 
      <Value OldValue="Value2" NewValue="NewValue2" ></Value> 
     </Item> 
    </xsl:variable> 

    <xsl:template match="Items"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Item"> 
     <xsl:copy> 
      <xsl:if test="not($Items/Item[@Name=current()/@Name]/Value[@OldValue = current()/@Value])"> 
       <!-- if value mismatch throw exception and stop --> 
      </xsl:if> 
      <xsl:attribute name="Value">      
       <xsl:value-of select="$Items/Item[@Name=current()/@Name]/Value[@OldValue = current()/@Value]/@NewValue"/> 
      </xsl:attribute> 
      <xsl:copy-of select="@*[name()!= 'Value']" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

這是工作,但我想現在要做的是檢查是否有值不匹配。 如果是,那麼腳本應該停止並拋出一個異常,我可以在Javascript函數中捕捉到。 有沒有辦法實現這一點?我可以爲此設置回調函數嗎?

回答

3

使用XSLT,您可以使用<xsl:message select="'some message'" terminate="yes"/>終止處理。最好是transformToDocument方法拋出一個Javascript異常,你可以用try/catch捕捉到,但似乎沒有發生,至少在我沒做過快速測試的時候。我不過能夠設置一個錯誤處理程序和處理在處理程序,信息,請參閱http://home.arcor.de/martin.honnen/xslt/test2014120301.html爲例,它確實

function onSaxonLoad() 
{ 
    Saxon.setLogLevel('SEVERE'); 
    var errors = []; 
    Saxon.setErrorHandler(function(error) { errors.push(error); }); 

    var xslt = Saxon.requestXML("test2014120301.xsl") 
    var xsltProc = Saxon.newXSLT20Processor(xslt); 

    xsltProc.setInitialTemplate("main"); 

    var errorCount = errors.length; 
    var doc = xsltProc.transformToDocument(); 
    if (errorCount < errors.length) { 
    var msg = errors[errors.length - 1].message; 
    var pre = document.createElement('pre'); 
    pre.textContent = msg; 
    document.body.appendChild(pre); 
    } 
    else { 
    // use result document doc here 
    }  

} 

消息撒克遜推向錯誤處理程序是SEVERE: XPathException in invokeTransform: Processing terminated by xsl:message in test2014120301.xsl。顯然,可能會有其他錯誤推送到錯誤處理程序,因此您需要在Javascript一側進行更多檢查,以檢查郵件測試是否包含Processing terminated by xsl:message