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

XSLT 2.0 error handling: throw exception to javascript

本文关键字:JavaScript 抛出异常 处理 错误 XSLT      更新时间:2023-09-26

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

使用 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
  }      
}

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