我在这里的第一篇文章 - 肯定希望有人知道答案!我已经能够为我遇到的许多问题找到解决方案,但对于这个问题却没有.关于同一主题的本网站上的问题和答案并没有解决我的问题......
我有一个包含格式规范的xml
<Format>
<TagNr>92</TagNr>
<Option>A</Option>
<Format>//[N]15d</Format>
</Format>
<Format>
<TagNr>92</TagNr>
<Option>B</Option>
<Format>//3!a/3!a/15d</Format>
</Format>
Run Code Online (Sandbox Code Playgroud)
TagNr +选项是此节点集中的唯一组合.
我定义了一个键,使得使用这组格式变得更容易:
<xsl:key name="xx" match="//Format/Format" use="concat(../TagNr, ../Option)"/>
Run Code Online (Sandbox Code Playgroud)
我确实可以使用这个键并获得正确的值,但仅限于非特殊元素; 我在以下每个或其他结构中使用此键时出现错误"XPath 2.0表达式中的错误不是节点项".
我尝试实现的目标如下:在处理的其他节点中,有一系列选项,我希望为每个字符检索格式.例如:
<Tag>
<TagNr>92</TagNr>
<Options>AB</Options>
</Tag>
Run Code Online (Sandbox Code Playgroud)
我一直在尝试下面的很多变种,但没有运气:
<xsl:variable name="TN"><xsl:value-of select="TagNr"/></xsl:variable>
<xsl:variable name="optList">
<xsl:analyze-string select="./Options" regex="[A-Z]">
<xsl:matching-substring>
<xsl:variable name="TNO" select="concat($TN, .)"/>
<opt>
<tag><xsl:value-of select="$TNO"/></tag>
<fmt><xsl:value-of select="key('xx', $TNO)"/></fmt>
</opt>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:variable>
Run Code Online (Sandbox Code Playgroud)
使用正则表达式分割成单个字符很顺利,并且(仅)检索(仅)opt/tag的值也很好.但是当我添加opt/fmt时,我遇到了上面提到的Xpath表达式的错误消息select ="key('xx',$ TNO)".
我尝试根据此站点上另一个线程中建议的键函数定义变量,但没有成功.
谁能帮我?
key()函数(带有两个参数)搜索包含上下文节点的文档.如果上下文项不是节点 - 例如,在analyze-string中 - 那么您将收到此错误,因为它不知道要搜索哪个文档.答案是使用key()的第三个参数来提供此信息.