2014-11-05 95 views
0

如果我有这样一个XML格式的查找表:选择基于节点的其他文档中值的节点

<lookup> 
    <element key='abc'>Hello</element> 
</lookup> 

而且这样的另一个XML文件:

<root> 
    <child key='abc'>Goodbye</child> 
</root> 

我为此XSL转换的第一个文件加载到一个变量之后:

<xsl:variable name="myvar" select="document('lookupfile.xml')/lookup" /> 
<xsl:value-of select="$myvar/element[@key=/root/child/@key]" /> 

我要的是价值“你好”来了,但我而我什么也得不到。我不允许直接比较两个节点的值吗?我看到的每个示例始终将[@key ='hardCodedValue']与其他节点的值进行比较。如果我硬编码的值如下所示:select =“$ myvar/element [@key ='abc']它返回'Hello'。如果我直接输出root/child键值为select =”/ root/child/@ key“我得到正确的'abc'值,它正好在我试图做上面的比较时,它什么也没有返回

+0

什么'$ myvar'的定义是什么? – 2014-11-05 18:35:55

+0

我编辑它以包含定义。 – 2014-11-05 18:42:01

+0

请发布可用于重现问题的**完整**示例。您的代码脱离了上下文 - 上下文在XPath/XSLT中非常重要。 – 2014-11-05 18:48:36

回答

1

在谓词中,上下文是lookupfile.xml文档的element元素,所以/root/child/@key即将该文档中进行评估

你可以做到这一点,与current()

<xsl:variable name="myvar" select="document('lookupfile.xml')/lookup" /> 
<xsl:value-of select="$myvar/element[@key = current()/root/child/@key]" /> 

或值存储在一个变量和使用:

<xsl:variable name="myvar" select="document('lookupfile.xml')/lookup" /> 
<xsl:variable name="mykey" select="/root/child/@key" /> 
<xsl:value-of select="$myvar/element[@key = $mykey]" /> 
+0

使用current()解决了我的简单测试示例中的问题!它在我的实际XML文档中不起作用,虽然在变量中转储了'/ root/child/@ key'等效值。我会试着弄清楚为什么current()在我的真实文件中不起作用,但我认为我在正确的轨道上。谢谢! – 2014-11-05 18:56:54