如何设计祖传xml分析
How to design ancestral xml analysis
我有一个必须在转换时进行的业务验证。这是因为某些信息仅在当时可用。
所以我开始做的是创建一个 XPath,它为我提供了我需要分析的所有节点,我已经实现了。这符合 .//*[@attributeIdentifyingMyNodes]
我纠结的是如何横传祖树。我知道我可以以某种方式走 parents;但我担心这样做的效率,因为每次转换可能会发生数百次。
我还需要遍历节点的整个父轴并确定每个节点是否为真,如果为假则消除该轴。我根据函数确定布尔值(出于实用目的,必须调用此函数来评估真或假)
- 但诀窍是,只有在我的 xpath 结果中标识的每个节点都有一个导致错误评估的父轴时,我才会出错。
我不反对完全不同的方法,比如将所有这些 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>
这是否适合您的情况取决于您尝试生成的输出的大局,您没有告诉我们。
我有一个必须在转换时进行的业务验证。这是因为某些信息仅在当时可用。
所以我开始做的是创建一个 XPath,它为我提供了我需要分析的所有节点,我已经实现了。这符合 .//*[@attributeIdentifyingMyNodes]
我纠结的是如何横传祖树。我知道我可以以某种方式走 parents;但我担心这样做的效率,因为每次转换可能会发生数百次。
我还需要遍历节点的整个父轴并确定每个节点是否为真,如果为假则消除该轴。我根据函数确定布尔值(出于实用目的,必须调用此函数来评估真或假)
- 但诀窍是,只有在我的 xpath 结果中标识的每个节点都有一个导致错误评估的父轴时,我才会出错。
我不反对完全不同的方法,比如将所有这些 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>
这是否适合您的情况取决于您尝试生成的输出的大局,您没有告诉我们。