我想将元素从外部XML加载到XSL模板文件中的变量中。我加载文档到变量没有问题,但我找不到正确的方法如何找到确切的节点,我需要基于它的子值。外部XML的结构为:
<mainNode>
<node1>
<nodeList1withManyChilds>
<nodeList2withOnlyOneChild>
<node2>
<node3>
<node4withIDvalueUsedToBeSelectedBy>100</node4withIDvalueUsedToBeSelectedBy>
</node3>
</node2>
</nodeList2withOnlyOneChild>
<nodeList2withOnlyOneChild>
<node2>
<node3>
<node4withIDvalueUsedToBeSelectedBy>101</node4withIDvalueUsedToBeSelectedBy>
</node3>
</node2>
</nodeList2withOnlyOneChild>
<nodeList2withOnlyOneChild>
<node2>
<node3>
<node4withIDvalueUsedToBeSelectedBy>102</node4withIDvalueUsedToBeSelectedBy>
</node3>
</node2>
</nodeList2withOnlyOneChild>
</nodeList1withManyChilds>
</node1>
</mainNode>
我需要选择正确的<node2>
元素,选择应该基于<node4...>
= 100的值。
在XSL文件中我有:
<xsl:variable name="firstList" select ="$loadedDoc//mainNode/node1" />
,我不知道如何分配给其他变量确切的<node2>
,它有孩子的孩子与搜索值。list collection给我带来了很多问题
谢谢你的提示!
源XML文档中没有名为"node"的元素,所以变量
<xsl:variable name="firstList" select ="$loadedDoc//node/node1" />
将是一个空序列。这不是一个好的开始。
在您的示例中,只有一个名为node4withIDvalueUsedToBeSelectedBy
的节点,因此您可以简单地将其选择为
//node4withIDvalueUsedToBeSelectedBy
但我怀疑这不是它的真实名称,因为结束标签不匹配,而且我们知道在文档的其他地方还有其他具有相同名称的元素。
也许你想要//node4withIDvalue[. = '100']
但是很难确定,因为你给我们的信息是不完整和不一致的。
如果我猜对了(!),您需要:
<xsl:variable name="var2" select="$loadedDoc//node2[descendant::node4withIDvalue=100]"/>
最后,我找到了解决办法。由于外部XML具有声明的名称空间,所以我以不正确的方式处理它们。声明包含命名空间的节点名根本不是一个好主意。是的,我没有在示例中提到名称空间,这表明它们在这种情况下对我来说是多么微不足道…
名称空间的解决方案是:
<xsl:variable name="var" select="$loadedDoc//*[local-name() = 'node4withIDvalueUsedToBeSelectedBy' and . = $varWithFindValue]" />
我的错,我没有提到所有重要细节的例子。谢谢。