2014-10-12 59 views
0

我试图提取在下面的XML请求的messageIdentifier的值:XSLT与所述节点的XPATH访问该节点值

<?xml version="1.0"?> 
<ordersRequest> 
<requestHeader> 
<verb>get</verb> 
<transaction>OrderRequest</transaction> 
<version>1.0</version> 
<consumer>Web</consumer> 
<messageIdentifier>123456789</messageIdentifier> 
</requestHeader> 
</ordersRequest> 

的意图是所述的XPath信息传递给样式表,使得相同的XSL可以用于任何其他请求(paymentRequest/requestHeader/messageIdentifier)以及requestHeader(paymentRequest/requestHeader/consumer)下的任何其他节点。我想出了以下XSL吧:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes" /> 
<xsl:param name="xpath" select="/" /> 
<xsl:template match="/"> 
    <xsl:value-of select="concat('/*/requestHeader/',$xpath)" /> 
</xsl:template> 
</xsl:stylesheet> 

输出这里出来为/*/requestHeader/messageIdentifier。当我将上面的样式表应用于以下编辑<xsl:value-of select="/*/messageHeader/messageIdentifier" />时,我在输出中获得值123456789。为什么输出有差异?请帮忙。

+0

您需要的是评估以字符串形式给出的XPath表达式。据我所知,这只有在XSLT 3.0中才有可能。你可以做的是使用XPath生成XSLT,然后执行生成的XSLT。 – 2014-10-12 14:29:23

回答

1

举个简单的子元素的选择,你可以使用

<xsl:param name="element-name" select="'messageIdentifier'"/> 

然后

<xsl:value-of select="/*/requestHeader/*[local-name() = $element-name]"/> 

如果你真的要执行XPath表达式动态再马库斯李凯尔特是正确的,你需要的XSLT 3.0和xsl:evaluate或者是早期版本中的扩展函数或元素,然后依赖于处理器,或者需要使用一个样式表生成XSLT代码并在第二步中执行该代码。