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