XSLT 2.0 错误处理:向 JavaScript 抛出异常
XSLT 2.0 error handling: throw exception to javascript
我有一个输入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
。
相关文章:
- 为什么浏览器没有为语法错误抛出异常
- 为什么JavaScript抛出'未捕获的ReferenceError:var未定义'定义var时
- PHP REST服务抛出异常——希望避免控制台错误
- 测试抛出异常的函数
- (为什么)我不能从生成器中抛出异常吗
- ascx page 中的 javascript 抛出 HTTPexception
- 如何抛出异常
- 在 Javascript 中,即使从未抛出异常,使用 try-catch 块是否昂贵
- 自定义抛出异常JavaScript的错误消息
- 在原型方法中抛出异常,未在外部尝试捕获 (JavaScript) 中捕获
- JavaScript 抛出了一个与拼接相关的异常 - 敌人[i] 是未定义的
- XSLT 2.0 错误处理:向 JavaScript 抛出异常
- 是否有任何解决方法可以重新抛出异常并在Javascript中保留堆栈争用
- 在javascript/nodejs中抛出异常真的那么糟糕吗?
- JavaScript -为什么推送不工作并抛出异常
- JavaScript在Java代码中抛出异常
- Javascript抛出异常
- 不要在JavaScript抛出异常时停止它
- 如何避免在JavaScript代码中断并抛出异常时显示angular标记
- 为什么.prototype. isprototypeof不是一个函数,我的javascript抛出了一个异常