如何设计祖传xml分析

How to design ancestral xml analysis

我有一个必须在转换时进行的业务验证。这是因为某些信息仅在当时可用。

所以我开始做的是创建一个 XPath,它为我提供了我需要分析的所有节点,我已经实现了。这符合 .//*[@attributeIdentifyingMyNodes]

我纠结的是如何横传祖树。我知道我可以以某种方式走 parents;但我担心这样做的效率,因为每次转换可能会发生数百次。

我还需要遍历节点的整个父轴并确定每个节点是否为真,如果为假则消除该轴。我根据函数确定布尔值(出于实用目的,必须调用此函数来评估真或假)

我不反对完全不同的方法,比如将所有这些 return 为真的节点评估为一个新的树变量

trueFalseEvaluation 函数替换属性以供说明之用

 <?xml version="1.0" encoding="UTF-8"?>
 <root trueFalseEvaluation="true">
     <someNode trueFalseEvaluation="true">
         <someOtherNode trueFalseEvaluation="false">
             <myNodeIdentified1 identifyingAttribute="true"/>
         </someOtherNode>
     </someNode>
     <someNode trueFalseEvaluation="false">
         <someOtherNode trueFalseEvaluation="false">
             <myNodeIdentified2 identifyingAttribute="true"/>
         </someOtherNode>
     </someNode>
     <someNode trueFalseEvaluation="true">
         <someOtherNode trueFalseEvaluation="true">
             <myNodeIdentified3 identifyingAttribute="true"/>
         </someOtherNode>
     </someNode>
     <someNode trueFalseEvaluation="true">
         <someOtherNode trueFalseEvaluation="true">
             <myNodeIdentified4 notIdentifying="true"/>
         </someOtherNode>
     </someNode>
 </root>

我想要的是 return 为真,因为 myNodeIdentified3 有一个完整的祖先轴,在每个节点上的计算结果为真。但是,如果 myNodeIdentified3's parents 中的任何一个为假,我的整个测试都会失败。

最后我需要在多个 xml 文档(多组根目录)中汇总这个

在此感谢您的帮助。我真的很担心我创建的任何解决方案都会增加我的内存占用量,或者降低我的转换性能。

嗯,显然你需要的测试是这样的

test="every $x in ancestor::* satisfies $x/@trueFalseEvaluation='true'"

或者如果您更喜欢简洁而不是清晰,

test="not(ancestor::*[not(@trueFalseEvaluation='true')])"/>

你似乎很关心这个的性能。要查看这些担忧是否真实,您需要陈述您的性能要求,然后衡量实际性能。

想到的唯一其他方法是在递归下降期间过滤节点,即仅当 @trueFalseEvaluation='true':

时才递归到节点的子节点
<xsl:if test="@trueFalseEvaluation='true'">
 <xsl:apply-templates/>
</xsl:if>

这是否适合您的情况取决于您尝试生成的输出的大局,您没有告诉我们。