2015-05-27 30 views
-1

我有一段业务验证,必须在变换时发生。这是由于当时只有一些信息可用。如何设计祖先的XML分析

所以我开始做的是创建一个XPath,它使我得到所有需要分析的结果。这是沿线.//*[@attributeIdentifyingMyNodes]

我在挣扎的是如何横切祖先树。我知道我可以以某种方式走路,但是我担心这种效率,因为每次转换可能会发生数百次。

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

  • 但是,如果每一个节点,在我的XPath的结果确定的诀窍是我只有一个错误,有一个父母轴,导致错误的评估。

我不反对完全不同的方法,如评估所有这些节点返回真正的进入一个新的树变量

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有一个完整的祖轴,在每个节点处都计算为真。但是,如果父母中的任何一个都是假的,我的整个测试都会失败。

最后,我需要在多个XML文件(多套根)

感谢这里的任何帮助,汇总此。我真的担心我创建的任何解决方案都会扩大我的内存空间,或者导致我的转换性能下降。

+2

我只能理解你想要做的一些事情。但我认真地认为,你应该通过张贴样本输出然后解释它,让某人提出任何解决方案,从而更具体地实现你想要达到的目标。 –

+0

嗯,我不想要任何输出。我想要做的是在转换过程中分析XML,以确保它符合我们的业务规则。 是否有一个不明确的特定部分? – TheNorthWes

+0

没有获得转换后的输出,其中一些值描述了XML与商业规则的有效性是一个好主意? –

回答

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> 

无论这对你的情况是适当的取决于你想要制作什么样的输出的更大的图像,你没有告诉我们。

+0

谢谢你的帮助迈克尔!我对此很新,我认为这会帮助我。 我一直在使用现有的变换,只是试图插入更多的检查;所以创建输出的过程现在不在我的手中。 – TheNorthWes