XSLT 2.0错误处理:向javascript抛出异常

时间:2014-12-03 11:39:33

标签: javascript xml xslt

我有一个输入XML文件:

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

我想用Saxon-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函数中捕获。 有没有办法实现这一点?我可以为此设置一个回调函数吗?

1 个答案:

答案 0 :(得分:3)

使用XSLT,您可以使用<xsl:message select="'some message'" terminate="yes"/>终止处理。我希望transformToDocument方法抛出你可以用try/catch捕获的Javascript异常,但它似乎不会发生,至少不是我做的快速测试。然而,我能够设置错误处理程序并在该处理程序中处理该消息,请参阅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
  }      

}

Saxon推送到错误处理程序的消息是SEVERE: XPathException in invokeTransform: Processing terminated by xsl:message in test2014120301.xsl。显然可能会有其他错误被推送到错误处理程序,因此您需要在Javascript端进行更多检查,以检查消息测试是否包含Processing terminated by xsl:message