XSL从带有列表的外部XML获取变量

时间:2016-09-10 14:46:36

标签: xml xslt-1.0

我想在XSL模板文件中将外部XML中的元素加载到变量中。我将文档加载到变量没有问题,但我找不到核心方法如何根据它的孩子的价值找到我需要的确切节点。外部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>分配给其他变量。列表集合让我有问题......

感谢任何提示!

3 个答案:

答案 0 :(得分:0)

源XML文档中没有名为“node”的元素,因此变量

<xsl:variable name="firstList" select ="$loadedDoc//node/node1" />

将是一个空序列。这不是一个好的开始。

在您的示例中,只有一个名为node4withIDvalueUsedToBeSelectedBy的节点,因此您可以将其简单地选为

//node4withIDvalueUsedToBeSelectedBy

但我怀疑这不是它的真实姓名,因为结束标记不匹配,而且我们知道在文档的其他地方还有其他同名元素。

也许你想要//node4withIDvalue[. = '100']

但是很难确定,因为你给我们的信息不完整且不一致。

答案 1 :(得分:0)

如果我正确猜测(!),你想:

<xsl:variable name="var2" select="$loadedDoc//node2[descendant::node4withIDvalue=100]"/>

答案 2 :(得分:0)

最后,我找到了解决方案。由于外部XML具有已声明的命名空间,因此我使用它们的方式并不正确。声明节点名称incl。命名空间根本就不是一个好主意。是的,我没有在例子中提到名称空间,这表明在这种情况下它们对我来说是多么微不足道......

名称空间的解决方案是:

<xsl:variable name="var" select="$loadedDoc//*[local-name() = 'node4withIDvalueUsedToBeSelectedBy' and . = $varWithFindValue]" />

我的错,我没有提到所有重要细节的例子。感谢。