循环依赖我处理的是,一个简单的XML文件,看起来像这样:处理与XSLT
<resources>
<resource id="a">
<dependency idref="b"/>
<!-- some other stuff -->
</resource>
<resource id="b">
<!-- some other stuff -->
</resource>
</resources>
XSLT样式表必须处理特定的资源,我们感兴趣的,我会打电话根资源以及所有递归依赖关系。依赖项是其他资源,由它们的id
属性唯一标识。
资源是否被处理两次并不重要,但最好只处理每个所需资源一次。它也无所谓什么顺序资源被处理。
重要的是,只有的根资源和递归依赖性处理。我们不能仅仅处理所有的资源并且完成它。
一个天真的执行情况如下:
<xsl:key name="resource-id" match="resource" use="@id"/>
<xsl:template match="resource">
<!-- do whatever is required to process the resource. -->
<!-- then handle any dependencies -->
<xsl:apply-templates select="key('resource-id', dependency/@idref)"/>
</xsl:template>
此实现了例如正常工作上面,以及在许多现实世界的情况。它的缺点是它经常处理同一资源不止一次,但如上所述,这并不重要。
的问题是,有时资源具有循环依赖:
<resources>
<resource id="a">
<dependency idref="b"/>
<dependency idref="d"/>
</resource>
<resource id="b">
<dependency idref="c"/>
</resource>
<resource id="c">
<dependency idref="a"/>
</resource>
<resource id="d"/>
</resources>
如果使用幼稚的做法来处理这个例子中,你通过处理开始,b或Ç,你获得无限递归。
不幸的是,我无法控制输入数据,在任何情况下,循环依赖都是完全有效的,并且被相关规范所允许。
我已经想出了各种部分解决方案,但没有任何工作在任何情况下。
理想的解决方案是防止节点被多次处理的一般方法,但我认为这是不可能的。事实上,我怀疑这个问题是无法解决的。
如果有帮助,我可以使用大部分EXSLT(包括函数)。如有必要,我还可以使用任意数量的其他XSLT脚本预处理输入,但最好不要对输出中不会执行的资源进行过多的预处理。
我不能做的是切换到另一种语言处理(至少不是没有实质性的重新设计)。我也不能使用XSLT 2.0。
任何想法?
+1对于一个写得很好的问题。祝您在XSLT 1.0中找到解决方案。如果你在这里没有得到答案,你可以在http://www.mulberrytech.com/xsl/xsl-list – 2010-08-04 02:13:53
试试XSL-LIST好问题(+1)。查看我的答案以获得完整而简单的解决方案。 :) – 2010-08-04 03:47:44
@吉姆加里森:好像丹尼尔好运:) :) – 2010-08-04 03:52:50