【问题标题】:XSLT with XPATH of the node to access the node valueXSLT 用节点的 XPATH 来访问节点值
【发布时间】:2014-10-12 14:23:04
【问题描述】:

我正在尝试在以下 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。当我使用以下编辑 &lt;xsl:value-of select="/*/messageHeader/messageIdentifier" /&gt; 应用上述样式表时,我在输出中得到值 123456789。为什么输出有差异。请帮忙。

【问题讨论】:

  • 您需要评估一个以字符串形式给出的 XPath 表达式。据我所知,这只能在 XSLT 3.0 中实现。您可以做的是使用您的 XPath 生成 XSLT,然后执行生成的 XSLT。

标签: xml xslt xpath


【解决方案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 代码并在第二步中执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-30
    • 2018-04-18
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多