XSLT用XPATH的节点来访问节点值

时间:2014-10-12 14:23:05

标签: xml xslt xpath

我试图在以下XML请求中提取messageIdentifier的值:

<?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。为什么输出有差异。请帮忙。

1 个答案:

答案 0 :(得分:1)

对于简单的子元素选择,您可以使用

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

然后

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

如果你真的想动态执行XPath表达式,那么Marcus Rickert是对的,你需要XSLT 3.0和xsl:evaluate或早期版本中的扩展函数或元素,然后依赖于处理器,或者你需要生成XSLT代码一个样式表并在第二步中执行。