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代碼並在第二步中執行該代碼。