如何使用 xslt 3.0 处理 try/catch 的错误异常

How can I handle error Exception with try/catch using xslt 3.0

如何使用 xslt 3.0 处理 try/catch 的错误异常。我在 xml number 元素中找到。如果在父产品中找不到数字元素,则生成一个文件 error.txt 以及如何编写异常。

输入XML

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <product dept="WMN">
        <name language="en">Fleece Pullover</name>
        <colorChoices>navy black</colorChoices>
    </product>
    <product dept="ACC">
        <number>563</number>
        <name language="en">Floppy Sun Hat</name>
    </product>
    <product dept="ACC">
        <number>443</number>
        <name language="en">Deluxe Travel Bag</name>
    </product>
    <product dept="MEN">
        <number>784</number>
        <name language="en">Cotton Dress Shirt</name>
        <colorChoices>white gray</colorChoices>
        <desc>Our <i>favorite</i> shirt!</desc>
    </product>
</catalog>

使用 XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:err="http://www.w3.org/2005/xqt-errors"
    exclude-result-prefixes="xs"
    version="3.0">

    <xsl:template match="/">
        <xsl:stream href="books.xml">
            <xsl:iterate select="catalog">
                <xsl:result-document href="out.xml" omit-xml-declaration="no" indent="yes">
                    <xsl:copy>
                        <xsl:for-each select="product">
                            <xsl:try>
                                <xsl:copy-of select="number"/>
                                <xsl:catch>
                                    <xsl:result-document href="error.txt">
                                        <xsl:message>Element number not given in <xsl:value-of select="product/@dept"/></xsl:message>
                                    <error code="{$err:code}" message="{$err:description}"/>
                                    </xsl:result-document>
                                </xsl:catch>
                            </xsl:try>
                        </xsl:for-each>
                    </xsl:copy>
                </xsl:result-document>
            </xsl:iterate>
        </xsl:stream>
    </xsl:template>

</xsl:stylesheet>

我的要求是当找不到数字元素时如何使用try/catch然后创建一个错误的文件。

尝试通过获取变量中的值在日志文件中生成错误消息,然后检查一些条件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:err="http://www.w3.org/2005/xqt-errors"
    exclude-result-prefixes="xs"
    version="3.0">

    <xsl:template match="/">
        <xsl:stream href="books.xml">
            <xsl:iterate select="catalog">
                <xsl:result-document href="out.xml" omit-xml-declaration="no" indent="yes">
                    <xsl:copy>
                        <xsl:for-each select="product">
                            <xsl:variable name="num" select="if (number) then (number) else ('aaaa')"/>
                            <xsl:try>
                                <number>
                                    <xsl:value-of select="format-number($num, '############')"/>
                                </number>
                                <xsl:catch>
                                    <xsl:result-document href="error.log" omit-xml-declaration="yes">
                                        <xsl:value-of select="concat('&#x00a0;Element number not given in ', @dept)"/>
                                        <xsl:value-of select="concat('&#x00a0;Error code: ', $err:code, ' and Error Desc is: ', $err:description)"/>
                                    </xsl:result-document>
                                </xsl:catch>
                            </xsl:try>
                        </xsl:for-each>
                    </xsl:copy>
                </xsl:result-document>
            </xsl:iterate>
        </xsl:stream>
    </xsl:template>

</xsl:stylesheet>