我必须在转换时进行一项业务验证。这是因为当时只提供了一些信息。
所以我开始做的是创建一个XPath,它让我得到了我需要分析的所有节点。这是.//*[@attributeIdentifyingMyNodes]
我正在努力的是如何横向祖先的树。我知道我可以以某种方式走向父母;但我担心这种效率,因为每次变换可能会发生数百次。
我还需要遍历节点的整个父轴,并确定每个节点是否为真,如果它是假的,则消除该轴。我根据函数确定布尔值(出于实际目的,必须调用此函数来评估true或false)
我并不反对完全不同的方法,例如评估所有这些返回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)
中聚合感谢您的帮助。我真的担心我创建的任何解决方案都会使我的内存占用空间膨胀,或者影响我的转换性能。
答案 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>
在您的情况下,这是否合适取决于您尝试生产的输出的大局,您没有告诉我们。