gpt4 book ai didi

xslt - 在 Saxon 中处理无限递归 XSL

转载 作者:行者123 更新时间:2023-12-02 11:41:55 25 4
gpt4 key购买 nike

我知道这个问题可能超出了 Saxon 的范围,并且与使用它进行转换的应用程序的体系结构更相关,但只是想尝试一下。考虑以下文件 -

XML

<?xml version="1.0" encoding="UTF-8"?>
<document>
string
</document>

XSL

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

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="node()">
<xsl:apply-templates select="."/>
</xsl:template>

</xsl:stylesheet>

XSL 在转换期间将进入无限递归,即堆栈溢出。我的问题是 - 有没有办法阻止或防止这种类型的转换进入无限递归?可以添加到命令行的任何参数可以触发警告并正常停止吗?

最佳答案

您可能只想创建自己的设置,而不是依赖现有设置来解决此类问题。

考虑针对您提供的非常简单的 XML 运行以下 XSL:

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

<xsl:variable name="recursion.limit" select="500" as="xs:integer"/>
<xsl:variable name="new.line" select="'&#x0A;'" as="xs:string"/>

<xsl:template match="/">
<xsl:value-of select="$new.line"/>
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="node()">
<xsl:param name="recursion.count" select="1" as="xs:integer"/>

<xsl:choose>
<xsl:when test="$recursion.count &lt;= $recursion.limit">
<xsl:value-of select="'&lt;' || name() || '&gt;' || ':' || $recursion.count || $new.line" disable-output-escaping="yes"/>
<xsl:apply-templates select=".">
<xsl:with-param name="recursion.count" select="$recursion.count + 1" as="xs:integer"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:message>
<xsl:value-of select="'Recursion limit of ' || $recursion.limit|| ' hit.'"/>
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

这肯定会阻止或防止这种类型的转换进入无限递归,但这当然不是自动的。您必须在代码中进行设置。但如果完成了,这可以用作自制最大深度设置。此时您所要做的就是参数化工作表以采用这样的值,而不是像我那样将其烘焙,这就是您的设置。这满足了您对可以添加到命令行的参数的需求,这些参数可以触发某种警告和/或优雅地停止。它是纯 XSL,因此应该是独立于引擎的,前提是您选择的引擎(我真的希望是 Saxon)能够正确满足 XSL 规范。

关于xslt - 在 Saxon 中处理无限递归 XSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com