如何设计祖先xml分析

时间:2015-05-27 23:41:20

标签: xml xslt xpath xslt-2.0 saxon

我必须在转换时进行一项业务验证。这是因为当时只提供了一些信息。

所以我开始做的是创建一个XPath,它让我得到了我需要分析的所有节点。这是.//*[@attributeIdentifyingMyNodes]

的内容

我正在努力的是如何横向祖先的树。我知道我可以以某种方式走向父母;但我担心这种效率,因为每次变换可能会发生数百次。

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

  • 但问题是,如果我的xpath结果中标识的每个节点都有一个导致错误评估的父级轴,那么我只会出错。

我并不反对完全不同的方法,例如评估所有这些返回true的节点到新的树变量

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>

我想要的是返回true,因为myNodeIdentified3有一个完整的祖先轴,在每个节点处的计算结果为true。但是,如果任何myNodeIdentified3's父母都是假的,我的整个测试都会失败。

最后我需要在多个xml文档(多组root)

中聚合

感谢您的帮助。我真的担心我创建的任何解决方案都会使我的内存占用空间膨胀,或者影响我的转换性能。

1 个答案:

答案 0 :(得分:1)

嗯,显然你需要的测试就像是

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>

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