XSL通过列表从外部XML获取变量



我想将元素从外部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]" />

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

相关内容

  • 没有找到相关文章

最新更新